2011-01-12 39 views
2

我有下面的代碼:c#如何訪問我的線程?

private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Thread t = new Thread(Process); 
     t.SetApartmentState(ApartmentState.STA); 
     t.Name = "ProcessThread"; 
     t.Start(); 
    } 

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     string msg = "Really close?"; 
     MessageBoxResult result = 
      MessageBox.Show(
      msg, 
      "Closing", 
      MessageBoxButton.YesNo, 
      MessageBoxImage.Warning); 
     if (result == MessageBoxResult.No) 
     { 
      e.Cancel = true; 
     } 
    } 

我需要做的代碼工作在私人無效WINDOW_CLOSING只有當它知道那麼ProcessThread還活着/ INPROGRESS /運行..

喜歡的東西IF( GetThreadByName(「ProcessThread」)。IsAlive == true)..

我該如何在C#中編寫它?

回答

5

聲明線程作爲成員變量在你的類來代替:

public class MyForm : Form 
{ 
    Thread _thread; 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     _thread = new Thread(Process); 
     _thread.SetApartmentState(ApartmentState.STA); 
     _thread.Name = "ProcessThread"; 
     _thread.Start(); 
    } 

    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 

     if (_thread.IsAlive) 
      //.... 

     string msg = "Really close?"; 
     MessageBoxResult result = 
      MessageBox.Show(
      msg, 
      "Closing", 
      MessageBoxButton.YesNo, 
      MessageBoxImage.Warning); 
     if (result == MessageBoxResult.No) 
     { 
      e.Cancel = true; 
     } 
    } 
} 
+0

太好了!這很簡單,我很白癡:)謝謝! – DefinitionHigh 2011-01-12 12:07:18

0

看System.Diagnostics.Process.GetProcessesByName()。
您也可以遍歷System.Diagnostics.Process.GetProcesses()來查找您的線程。

或者您可以將您的線程放在您班級的全球範圍內,以便您可以從此處訪問它。

注意:我建議您在創建的所有線程上使用.IsBackround = true,這樣一來,胭脂線程不會阻止您的應用程序正常退出。 :)

1

一種方法是聲明一個成員變量,它指定後臺線程是否正在運行。線程啓動時,可以將該變量設置爲true,然後在線程工作完成時將其設置爲false。

當調用Window_Closing時,您可以檢查變量以查看線程是否已完成。

您應變量聲明爲揮發,某些編譯/運行的優化可以正常工作停止這種做法:

private volatile bool workerThreadRunning = false;