2010-03-01 74 views
3

正常情況下,我正在創建每個線程,我想要執行多線程。我是這樣做這樣的:有沒有辦法檢查.NET線程池中運行的是什麼?

private Thread threadForWycena; 

private void someMethod() { 
     threadForWycena = new Thread(globalnaWycena); 
     threadForWycena.Start(); 
} 

然後,當用戶想要關閉該GUI的我在檢查該線程之一,如果它是在我被dissalowing將其關閉。

private void ZarzadzajOplatamiGlobalneDzp_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (threadForWycena.IsAlive) { 
      MessageBox.Show("Wycena jest w toku. Zamknięcie okna jest niemożliwe.", "Brak wyjścia :-)"); 
      e.Cancel = true; 
     } 
    } 

有沒有辦法使用線程池來做到這一點,這樣我可以阻止窗口關閉,我可以告訴用戶哪個線程仍然活着,什麼是它做什麼?

回答

3

沒有直接的方法來檢測線程池工作項目在.NET中何時完成。然而,添加一個並不難。

  • 創建ManualResetEvent
  • 在設置此事件的工作項的結束。
  • 要檢查工作項目是否已完成,請在事件上執行零超時等待以查看是否已設置。

例如, (使用的λ以關閉在所述事件和避免修改代碼在運行線程池):

var e = new ManualResetEvent(false); // false => not set to sart 
ThreadPool.QueueUserWorkItem(_ => { FunctionToCall(); e.Set(); }); 
// Continue concurrently.... 
if (e.WaitOne(0)) { 
    // The work item has completed 
} 

順便提及,在.NET 4 Task類(和亞型)提供了更豐富的模型來運行線程池中的代碼,包括直接返回結果的能力,或者繼續執行另一個任務。

+0

因此,如果沒有使用游泳池,實際上會更困難。只是想知道,如果使用許多'私人線程threadForWycena'(當然是用不同的名稱而不是一個池)是否看起來'跛腳',這對我來說實際上知道發生了什麼,什麼是正在運行以及什麼不是。正在運行的功能將不會再運行,直到舊的功能結束。 – MadBoy 2010-03-01 13:02:41

1

RegisterWaitForSingleObject將在完成執行時發出等待手柄信號。

+0

考慮到我給出的例子,如何正確使用它? – MadBoy 2010-03-01 08:44:56

相關問題