我有一个 Threading.Tasks.Task 来处理许多客户端套接字操作(连接、接收和发送)。
我知道在可能的情况下,最好使用 Await 来使用非阻塞方法,否则我将以“停放的线程等待它们的响应”而告终。但是,虽然 Socket 类具有异步方法(SendAsync 等),但它们与通常的任务并行库异步方法不同,它们不返回任务且无法等待。
我意识到我可以用 TaskCompletionSource 包装这些套接字异步方法,但这样做有什么好处,还是它最终仍会停放线程?
最佳答案
正如 Servy 所解释的那样。只要您正确使用异步模式,使用 TaskCompletionSource
本身不会创建(或停放)任何线程。
.Net 框架中有 3 种不同的异步模式:
- Asynchronous Programming Model (APM) .
- Event-based Asynchronous Pattern (EAP) .
- Task-based Asynchronous Pattern (TAP) .
您要实现的是将一种模式(EAP)“转换”为另一种模式(TAP)。一个更简单的解决方案是使用 .Net 的内置“转换”从 APM 模式到 TAP,Task.Factory.FromAsync
(内部使用 TaskCompletionSource
):
应用程序管理
socket.BeginConnect(host, port, asyncResult =>
{
socket.EndConnect(asyncResult);
Console.WriteLine("Socket connected");
}, null);
点击
await Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, host, port, null);
Console.WriteLine("Socket connected");
关于c# - 任务中的异步套接字操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25814575/