【发布时间】:2015-02-03 20:33:48
【问题描述】:
我从头开始编写了一个网络服务器应用程序,所以没有 IIS 或 Windows 窗体。我一直在使用 Task.Run 来移交对网络会话生命周期的控制以在后台运行。
类似...
while (true)
{
var tcpClient = tcpListener.Accept...
Task.Run(() => ProcessSession(tcpClient));
}
...然后...
public async Task ProcessSession(TcpClient tcpClient)
{
...
await tcpClient.GetStream().ReadAsync(...)
...
}
我希望当我在 ProcessSession 中对网络 I/O 执行 async / await 时,工作线程将被释放,直到 I/O 完成。
我发现我的服务器软件在只有几百个连接的情况下陷入困境,以至于客户端尝试连接时超时,或者如果他们连接到网络吞吐量确实很慢。我希望每台服务器处理数千个连接。
当我查看 ThreadPool.Get(Max/Available)Threads 时,它看起来并没有发生太多事情。 Process.GetCurrentProcess().Threads.Count 只有几十个,所以它不像每个连接一个线程。它只是陷入困境。
【问题讨论】:
-
见this问题。
标签: c# .net multithreading task