C# 线程池导致GUI冻结(?)

C# 线程池导致GUI冻结(?),c#,.net,threadpool,C#,.net,Threadpool,我注意到,如果我的IO密集型应用程序的线程池最大线程数设置得太低(16),那么我的GUI将冻结。但是,如果我将它设置得相当高(250),它就可以正常工作 有人能解释这种现象吗?哇!除非你知道自己在做什么,否则不要搞乱线程池的数量——许多重要的.NET服务可能正在使用它,并且依赖它不会饱和。几乎可以肯定的是,一些基本的IO代码由于饱和而陷入僵局 我可以想象,在这种特殊情况下,正是IO完成端口让您绊倒 乔·达菲(他比我更了解线程)对此有一些想法 重新思考如何通过饱和使其死锁——这在思维实验中很容易再

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


有人能解释这种现象吗?

哇!除非你知道自己在做什么,否则不要搞乱线程池的数量——许多重要的.NET服务可能正在使用它,并且依赖它不会饱和。几乎可以肯定的是,一些基本的IO代码由于饱和而陷入僵局

我可以想象,在这种特殊情况下,正是IO完成端口让您绊倒

乔·达菲(他比我更了解线程)对此有一些想法

重新思考如何通过饱和使其死锁——这在思维实验中很容易再现;假设您有一些工作代码需要做两件事。。。我们将其中的一个推到线程池中,然后自己做一个;在完成我们自己的工作之后,我们将加入()第二个任务[或线程池等价物],以便我们知道这两个任务都已完成

现在想象一下,我们在最后一个可用的线程池线程上启动这个工作线程:我们自己完成工作,然后等待第二个任务已经完成的信号——但是没有可用的线程来完成它!我们不能释放我们自己的,因为我们还在等待


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

哇哦!除非你知道自己在做什么,否则不要搞乱线程池的数量——许多重要的.NET服务可能正在使用它,并且依赖它不会饱和。几乎可以肯定的是,一些基本的IO代码由于饱和而陷入僵局

我可以想象,在这种特殊情况下,正是IO完成端口让您绊倒

乔·达菲(他比我更了解线程)对此有一些想法

重新思考如何通过饱和使其死锁——这在思维实验中很容易再现;假设您有一些工作代码需要做两件事。。。我们将其中的一个推到线程池中,然后自己做一个;在完成我们自己的工作之后,我们将加入()第二个任务[或线程池等价物],以便我们知道这两个任务都已完成

现在想象一下,我们在最后一个可用的线程池线程上启动这个工作线程:我们自己完成工作,然后等待第二个任务已经完成的信号——但是没有可用的线程来完成它!我们不能释放我们自己的,因为我们还在等待


您也可以对IO完成端口执行同样的操作。

但为什么这会抢占GUI线程(可能不是从线程池分配的)?另外,我没有使用IO完成端口。不过,系统可能正在使用它们。。。这就是它与操作系统的各个部分进行对话(异步)的方式。但为什么这会抢占GUI线程(可能不是从线程池分配的)?另外,我没有使用IO完成端口。不过,系统可能正在使用它们。。。这就是它与操作系统的各个部分进行对话(异步)的方式。