c# - 有没有办法检查 .NET 线程池中正在运行什么?

标签 c# winforms multithreading threadpool

通常我会为每个我想做多线程的 Action 创建每个线程。我是这样做的:

private Thread threadForWycena;

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

然后,当用户想要关闭其中一个图形用户界面时,我会检查这个线程,如果它在,我会拒绝关闭它。

    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 来做到这一点,这样我就可以防止窗口关闭,并且我可以告诉用户哪个线程还活着,它在做什么?

最佳答案

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

关于c# - 有没有办法检查 .NET 线程池中正在运行什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2354522/

相关文章:

c# - linq/lambda 查询中的双内连接?

c# - 为什么 DataTable.Select 默认对数据进行排序

c# - 调用被被调用者拒绝

c# - 小游戏形式

python - 需要将抓取的数据写入csv文件(线程)

python - 将多个变量传递给PoolExecutor

multithreading - RxJava - 如何将观察者设置为阻止

c# - 从 SQL Server 批量获取记录的最佳方法是什么

c# - 检查List是否包含特定类型(多个)

c# - 禁用或使其只读成为文本框 (.net) 中值的一部分