2010-03-01 48 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

相关问题