作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,我构建了一个高度多线程的并发应用程序,它管理自己的工作线程(因为它们在整个应用程序生命周期内运行)。现在我使用 SocketAsyncEventArgs 进行网络连接,它在后台使用 I/O 完成端口。
当我正常运行应用程序时,一切正常,我在应用程序中获得大约 30-60 个线程(包括我自己的工作线程)。
但是当我在调试时在 visual studio 中暂停应用程序时,线程的数量很容易上升到几百个(到目前为止最坏的情况是 500+)。现在我意识到(?)这是由于暂停应用程序和为 I/O 端口生成新线程造成的,但是有没有办法阻止这种情况的发生,因为线程数量使 visual studio 停止了约 20 秒并使很难调试。
最佳答案
这也是为什么线程池一般都有线程限制的原因。听起来像是每个网络事件都在启动一个新线程。这可能很昂贵,肯定比回收线程更昂贵。我认为通常这样做的方式是让一个线程从网络中挑选出来并将东西放入缓冲区。当缓冲区已满时,您将停止从网络上获取信息(或删除信息)。有一组不同的线程从缓冲区中挑选东西并处理它们。
您的应用程序中发生的情况听起来像是每个传入的网络请求都会产生一个新线程。监听这些新线程的线程被调试器阻塞,或者这些新线程也可能被调试器阻塞。无论哪种方式,新线程都会不断产生并被调试器阻止。我真的不确定你会如何设置它,除非你有一个看起来像这样的接收函数:
public void Recv(object sender, EventArguments ea)
{
Thread.Start(new ThreadMain());
// do some more stuff <-- this is where you block
}
您不需要从异步接收方法启动新线程。
关于c# - 暂停使用 IOCP 的应用程序时创建的线程过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8390119/
我是一名优秀的程序员,十分优秀!