暂停使用IOCP的应用程序时创建的线程太多

时间:2011-12-05 18:35:34

标签: c# .net multithreading visual-studio debugging

因此,我构建了一个高度多线程和并发的应用程序来管理自己的工作线程(因为它们在整个应用程序生命周期内运行)。现在我使用SocketAsyncEventArgs进行网络连接,它在后台使用I / O完成端口。

当我正常运行应用程序时,一切正常,我在应用程序中获得约30-60个线程(包括我自己的工作线程)。

但是当我在调试时在Visual Studio中暂停应用程序时,线程的安装量很容易上升到几百(最坏的情况到目前为止是500+)。现在我意识到(?)这是因为暂停应用程序和为I / O端口产生的新线程,但是有一种方法可以阻止这种情况发生,因为线程数量使视觉工作室暂停约20秒并使它很难调试。

1 个答案:

答案 0 :(得分:0)

这就是线程池通常存在线程限制的原因。听起来正在发生的事情是每个网络事件都在启动一个新线程。这可能是昂贵的,当然比回收线程更昂贵。我认为通常这样做的方法是让一个线程挑选网络并将内容放入缓冲区。当缓冲区已满时,您将停止从网络上拾取内容(或删除信息)。有一组不同的线程正在从缓冲区中取出并处理它们。

您的应用程序中发生的声音是每个传入的网络请求都会生成一个新线程。侦听器会阻止侦听这些新线程的线程,或者这些新线程也可能被调试器阻止。无论哪种方式,新线程都会被调试器生成并阻塞。我不确定你是怎么设置它的,除非你有一个看起来像这样的接收函数:

public void Recv(object sender, EventArguments ea)
{
     Thread.Start(new ThreadMain());
     // do some more stuff <-- this is where you block
}

您不需要从异步接收方法启动新线程。