【问题标题】:ThreadPool causing GUI to freeze (?)线程池导致 GUI 冻结(?)
【发布时间】:2010-09-20 23:30:55
【问题描述】:

我注意到,如果我的 IO 密集型应用程序的 ThreadPool 最大线程数设置得太低 (16),那么我的 GUI 将冻结。但如果我将它设置得更高(250),它就可以正常工作。

谁能解释这种现象?

【问题讨论】:

    标签: c# .net threadpool


    【解决方案1】:

    哇!除非您知道自己在做什么,否则不要弄乱 ThreadPool 计数 - 许多基本的 .NET 服务可能正在使用它,并且依赖它不会饱和。几乎可以肯定,您已经通过饱和使一些基本 IO 代码陷入僵局。

    我想在这种特殊情况下是 IO 完成端口让你绊倒......

    Joe Duffy(他比我更了解线程)对此 here 有一些想法。

    关于如何通过饱和来死锁——这在思想实验中很容易重现;假设您有一些工作代码需要做 2 件事……我们将其中 1 件推送到 ThreadPool 上,然后自己做一个;在完成我们自己的工作之后,我们将 Join() [或等效的 ThreadPool] 第二个任务,以便我们知道两者都已完成。

    现在想象一下,我们在最后一个可用的 ThreadPool 线程上启动这个工作代码:我们做自己的工作,然后等待第二个任务已经完成的信号 - 但是没有可用的线程来做它!而且我们不能发布我们自己的,因为我们还在等待。

    您可以对 IO 完成端口执行相同操作。

    【讨论】:

    • 但是为什么这会抢占GUI线程,这大概不是从线程池分配的?
    • 另外,我没有使用 IO 完成端口。
    • 系统 可能正在使用它们,不过……这就是它与操作系统各个部分对话(异步)的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2018-01-30
    • 2014-12-22
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多