【发布时间】:2017-08-22 09:45:54
【问题描述】:
我正在研究一个非常流行的 c# 代理服务器。其中有诸如(我故意隐藏代理服务器身份,因为我感觉不好讲故事,如果确实是错误的)。
private void OnConnectionAccepted(TcpClient cl)
{
....
Task.Run(async () =>
{
await HandleClientRequest();
});
Task.Run(async () =>
{
TcpClient cl = await listener.AcceptTcpClientAsync();
OnConnectionAccepted(cl);
});
}
HandleClientRequest 在哪里进行一些异步网络调用,例如从客户端读取请求并将其重复到服务器,就像您期望代理做的那样。
listener.AcceptTcpClientAsync 只是等待下一个来自浏览器的连接。
因此,Task.Run 的重点似乎只是允许在 HandleClientRequest 忙碌时调用 AcceptTcpClientAsync。
这似乎与我一直在阅读的建议背道而驰,例如。 http://blog.stephencleary.com/2013/10/taskrun-etiquette-and-proper-usage.html 因为 Task.Run 正在包装网络,而不是 CPU 调用。
那么它应该如何工作,如果这是错误的,它应该使用 ThreadPool.QueueUserWorkerItem 吗?
顺便说一句,上下文通常是控制台应用程序。
【问题讨论】:
-
您调用的两个方法都是异步的,因此返回 should 任务。为什么不创建这些任务的数组并调用 Task.WaitAll(...)?请注意,您可能希望在返回的 Task 对象上调用 .ConfigureAwait(...) ,否则您可能会有 very long wait :)
-
P.S. Stephen 的博客说您不应该在异步方法的实现中使用 Task.Run,但建议您可以使用 Task.Run 来调用异步方法。
-
为什么你觉得你必须用
Task.Run包装这些异步调用?你为什么不等待他们中的任何一个? -
记住这不是我的代码,我试图了解它是否是最好的方法。
标签: c# asynchronous async-await threadpool