gpt4 book ai didi

C# 等到所有线程在 ThreadPool 中终止

转载 作者:太空狗 更新时间:2023-10-30 00:36:19 26 4
gpt4 key购买 nike

我有一个主线程,还有许多其他后台线程。

这些后台线程的主要用途是查询数据(许多来自网络的查询,这就是我创建多个线程的原因:以避免滞后的用户界面)。

当涉及到在主线程(用户界面)中导出数据时,我需要等到所有其他线程都完成。

我的代码是:

//...code to open save file dialog...

//this loop is to wait for all the threads finish their query
//QueryThread.threadCount is the count of the background threads
while (QueryThread.threadCount != 0)
{
Thread.CurrentThread.Join(1000);
Console.WriteLine(QueryThread.threadCount);
}

//...code to export data...

如果我将 while 循环注释掉,程序将顺利运行,但我导出的一些数据可能会显示一些“不需要的” Material ,因为一些后台线程尚未完成它们的工作。

然而,上面的 while 循环是无限的,threadCount 永远不会改变,这意味着在“Join()”方法期间,没有后台线程在运行。

为什么后台线程会阻塞,如何解决?

非常感谢!

最佳答案

您正在调用 Join当前线程上的方法没有多大意义。你应该在你的工作线程上调用它:

foreach (Thread thread in workerThreads)
{
thread.Join(1000);
}

不幸的是,这种做法违背了使用线程的目的,因为它会阻塞调用,直到所有其他线程完成。

RunWorkerCompleted BackgroundWorker 的事件可用于通知后台任务完成并在表单上执行更新。

关于C# 等到所有线程在 ThreadPool 中终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2286899/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com