有没有办法检查.NET线程池中运行的是什么?

时间:2010-03-01 08:15:04

标签: c# winforms multithreading threadpool

通常我是按照我想做多线程的动作创建每个线程的。我是那样做的:

private Thread threadForWycena;

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

然后,当用户想要关闭其中一个gui时,我正在检查这个帖子,如果它已经开启,我就不愿意关闭它。

    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;
        }
    }

有没有办法使用ThreadPool,这样我可以阻止窗口关闭,我可以告诉用户哪个线程还活着,它在做什么?

2 个答案:

答案 0 :(得分:4)

没有直接的方法来检测线程池工作项何时在.NET中完成。但是添加一个并不难。

  • 创建ManualResetEvent
  • 在工作项结束时设置此事件。
  • 检查工作项是否已完成,对事件执行零超时等待以查看是否已设置。

E.g。 (使用lambda来关闭事件并避免修改代码以在线程池中运行):

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类(和子类型)提供了一个更丰富的模型来运行线程池中的代码,包括直接返回结果或继续执行其他任务的能力。

答案 1 :(得分:1)

RegisterWaitForSingleObject将在完成执行时发出等待句柄的信号。