场景
我有一个 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/