.NET 线程池 - WinForms UI 无响应

Goo*_*ber 2 c# backgroundworker winforms threadpool

设想

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

问题

我是否正确地认为解决此问题的最佳方法是使用后台工作人员?UI 是否锁定,因为即使我使用许多不同的线程(为了速度),UI 本身并不位于其自己的单独线程上?

非常感谢建议的实施。

编辑!!

因此,我们可以说,我决定以 100 个为一组进行批量处理,而不是仅仅发送并排队 3000 个资产进行处理。我将如何有效地做到这一点?我早些时候尝试添加“Thread.Sleep(5000);” 每一批 100 个都被发射之后,但整个事情似乎一团糟......

Eri*_* J. 5

如果您要创建 3000 个单独的线程,则会推动ThreadPool 类的记录限制:

如果应用程序遇到突发活动,其中大量线程池任务排队,请使用 SetMinThreads 方法增加空闲线程的最小数量。否则,创建新空闲线程的内置延迟可能会导致瓶颈。

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

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

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