2009-12-08 48 views
0

假設我有一個這樣的程序:如何知道我有另一個線程與主線程分開?

private void button1_Click(object sender, EventArgs e) 
{ 
    Thread t = new Thread(new ThreadStart(Some_Work)); 
    t.Start(); 
} 

我需要把一個條件,這樣,「如果沒有已經從主線程中運行除了一個線程,開始一個新的線程」。

但如何測試一個線程是否正在運行,而不是主線程?

回答

1

最簡單的解決方案當然是存儲對現有線程的引用,或者只是設置一個標誌,讓您有一個線程正在運行。

您還應該維護該字段(引用或標記),以便如果線程退出,應該取消設置該字段,以便下一個「啓動請求」啓動一個新的字段。

最簡單的辦法:

private volatile Thread _Thread; 

... 

if (_Thread == null) 
{ 
    _Thread = new Thread(new ThreadStart(Some_Work)); 
    _Thread.Start(); 
} 

private void Some_Work() 
{ 
    try 
    { 
     // your thread code here 
    } 
    finally 
    { 
     _Thread = null; 
    } 
} 
2

在您的.NET應用程序中還有其他幾個線程運行之前,它甚至得到button1_Click。例如,終結者線程總是處於閒置狀態,我認爲WinForms會爲其自身創建一個或兩個線程。

您是否需要了解您創建的其他線程?如果是這樣,你應該自己跟蹤它們。如果不是:爲什麼?

編輯:你是否希望啓動一些後臺處理需求?你有沒有看到BackgroundWorker組件,它爲你管理線程,以及它們與用戶界面的交互?或直接編程針對線程池,使用Delegate.BeginInvokeThreadPool.QueueUserWorkItem

+1

此外,Win32的創建和當它要停止自己的線程。例如,顯示一個標準的打開文件對話框將創建幾個線程(並且非標準的shell擴展可能會創建更多); 'QueueUserWorkItem()'可以爲系統線程池創建額外的線程等。 – atzz 2009-12-08 06:57:39

+0

它回答你的問題。我仍然不確定爲什麼這些信息是有用的:它總是會在.NET應用程序中返回> 1。 – 2009-12-08 06:58:07

+0

這更像是它,雖然不確定你是否需要'IsAlive'檢查,如果你有'!= null'檢查。 – 2009-12-08 06:59:58

相關問題