gpt4 book ai didi

c# - 如果 .NET Task.Run 用于运行 CPU 绑定(bind)任务,那么启动 IO 绑定(bind)任务以在后台运行的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:37 27 4
gpt4 key购买 nike

我从头开始编写了一个网络服务器应用程序,因此没有 IIS 或 Windows 窗体。我一直在使用 Task.Run 来控制网络 session 的生命周期,以便在后台运行。

有点像...

while (true)
{
var tcpClient = tcpListener.Accept...
Task.Run(() => ProcessSession(tcpClient));
}

……然后……

public async Task ProcessSession(TcpClient tcpClient)
{
...
await tcpClient.GetStream().ReadAsync(...)
...
}

我希望当我在 ProcessSession 中使用网络 I/O 执行异步/等待时,工作线程将被释放,直到 I/O 完成。

我发现我的服务器软件在只有几百个连接时陷入困境,以至于客户端在尝试连接时超时,或者如果它们连接上了,它们的网络吞吐量确实很慢。我希望每台服务器处理数千个连接。

当我查看 ThreadPool.Get(Max/Available)Threads 时,它看起来并没有发生太多事情。 Process.GetCurrentProcess().Threads.Count 只有几十个,所以它不像是每个连接一个线程。它只是陷入困境。

最佳答案

利用网络堆栈的内置异步是正确的解决方案,看起来这就是您使用 TcpClient 所做的事情。

鉴于您“陷入困境”,请调查瓶颈所在。没有人可以在不知道问题是什么的情况下解决性能问题。你的内存空间是什么样的?时间都花在哪儿了? perfmon 说您的服务器进程中发生了什么?

关于c# - 如果 .NET Task.Run 用于运行 CPU 绑定(bind)任务,那么启动 IO 绑定(bind)任务以在后台运行的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28308222/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com