igu*_*man 4 .net c# sockets asynchronous task-parallel-library
我有一个Threading.Tasks.Task,它处理许多客户端套接字操作(连接,接收和发送).
我知道在可能的情况下最好使用Await使用非阻塞方法,否则我最终会得到"驻留线程等待他们的响应".但是,虽然Socket类具有异步方法(SendAsync等),但它们与通常的任务并行库异步方法不同,它们不会返回任务并且无法等待.
我意识到我可以使用TaskCompletionSource包装这些套接字异步方法,但是这样做有什么好处还是最终仍然会停止线程?
i3a*_*non 13
正如Servy解释的那样.TaskCompletionSource只要您正确使用异步模式,使用as本身不会创建(或停放)任何线程.
.Net框架中有3种不同的异步模式:
你想要实现的是将一种模式"EAP"转换为另一种模式,即TAP.一个更简单的解决方案是使用.Net从APM模式到TAP的内置"转换" Task.Factory.FromAsync(内部使用TaskCompletionSource):
socket.BeginConnect(host, port, asyncResult =>
{
socket.EndConnect(asyncResult);
Console.WriteLine("Socket connected");
}, null);
Run Code Online (Sandbox Code Playgroud)
await Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, host, port, null);
Console.WriteLine("Socket connected");
Run Code Online (Sandbox Code Playgroud)