c# - .NET 线程池 - 无响应的 WinForms UI

标签 c# winforms backgroundworker threadpool

场景

我有一个 Windows 窗体应用程序。在主窗体内部有一个循环大约 3000 次,在新线程上创建类的新实例以执行一些计算。请记住,此设置使用线程池,当此循环只有大约 100 次迭代(要处理 100 个 Assets )时,UI 确实会保持响应。但一旦这个数字开始大幅增加,UI 就会锁定到 eggtimer 模式,因此写入表单列表框的日志变得不可读。

问题

我是否认为最好的解决方法是使用后台 worker ? UI 是否锁定,因为即使我使用了很多不同的线程(为了速度),UI 本身也不在其自己的单独线程上?

非常感谢建议的实现。

编辑!!

所以可以说,我决定以 100 个为一组进行处理,而不是仅仅启动并排队处理 3000 个 Assets 。我将如何有效地执行此操作?我早些时候尝试添加“Thread.Sleep(5000);”在每一批 100 个都被解雇之后,但整个事情似乎都糟透了……

最佳答案

如果您要创建 3000 个单独的线程,那么您将推送一个 documented limitation ThreadPool 类的:

If an application is subject to bursts of activity in which large numbers of thread pool tasks are queued, use the SetMinThreads method to increase the minimum number of idle threads. Otherwise, the built-in delay in creating new idle threads could cause a bottleneck.

请参阅该 MSDN 主题以获取针对您的情况配置线程池的建议。

如果您的工作是 CPU 密集型工作,那么拥有那么多独立线程会导致超出其值(value)的开销。但是,如果 IO 非常密集,拥有大量线程可能会有所帮助。

.NET 4 引入了对并行编程的出色支持。如果这是您的选择,我建议您 have a look at that .

关于c# - .NET 线程池 - 无响应的 WinForms UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501522/

相关文章:

javascript - 无法使用外部 Url 加载 div

c# - 在 C# 中创建非阻塞异步门

c# - Task.Wait() 在静态字段初始化期间调用时从不返回?

wpf - 无法使用 UI 线程 Dispatcher 更新 UI?

c# - 更新后台 worker winforms中的标签文本

c# - 如何将日期时间变量设置为空

c# - NPoco InsertBulk() 花了 45 *分钟* 插入 20,000 条记录

winforms - Visual Studio 中跨项目共享 WinForms 资源的问题

c# - 捕获 Windows 窗体上的 Enter 键按下不起作用

wcf - 如何使用后台工作线程制作 WCF 服务?