我有一个代码(在服务器上),该代码使用异步方法在这样的插座上接收数据:

asyncRes = connectionSocket.BeginReceive(receiveBuffer, 0, RECEIVING_BUFFER_SIZE,
    SocketFlags.None, out error, new AsyncCallback(ReceiveDataDone), null);

在插座的处理程序中(接收到的载体),在某些情况下,使用线程(x)来等待其他东西(确实可疑实现)。我知道这是一个可疑的设计,但我想知道制作这种代码是否可以解释我的应用程序中创建的线程的爆炸,因为服务器中的其他已待处理的插座已接收到他们的接收载体。 (当服务器处理许多连接时,创建的线程数量爆炸)。我想知道如何 BeginReceive .NET插座上的方法可以解释我看到的大量线程。

有帮助吗?

解决方案

您绝对不应该在APM回调中执行任何类型的阻止操作。这些是在ThreadPool中运行的。 ThreadPool设计用于调用短期任务。如果您阻止(或花费很长时间执行),则将(有限数量)线绑定并引起线程池饥饿。由于ThreadPool不容易旋转额外的线程(实际上,启动额外的线程非常慢),因此您可以在时间安排上,以控制允许线程池旋转新线程的速度。

尽管回答了一个不同的问题,但我回到一段时间以来提供了这个答案,解释了同样的问题:

https://stackoverflow.com/a/1733226/14357

其他提示

你不应该使用 Thread.sleep 对于在螺纹池中等待,这会导致螺纹被阻止,并且在阻止其时将不接受任何进一步的工作词。

您可以使用 TimerCallback 对于这种用例。它会让 ThreadPool 同时,在等待线程上安排其他工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top