有没有一种方法可以检查.NET线程池中正在运行的内容?

4

通常情况下,我会为每个想要进行多线程操作的动作创建一个线程。我的做法是这样的:

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

有没有一种使用线程池的方法,可以防止窗口关闭,并且告诉用户哪个线程仍然活着以及正在执行什么任务?
2个回答

4

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

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

例如(使用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类(以及子类型)提供了更丰富的模型来在线程池中运行代码,包括直接返回结果或继续执行另一个任务。


所以,如果没有使用线程池,实际上会更难。我只是想知道使用许多private Thread threadForWycena;(当然,名字不同而不是一个池)是否看起来很“无聊”。对我来说,了解正在发生什么,正在运行什么以及什么没有运行是更容易的。通常,正在运行的功能在旧功能完成之前不会再次运行。 - MadBoy

1

考虑到我给出的例子,一个人应该如何正确地使用它? - MadBoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接