任务中的异步套接字操作

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种不同的异步模式:

  1. 异步编程模型(APM).
  2. 基于事件的异步模式(EAP).
  3. 基于任务的异步模式(TAP).

你想要实现的是将一种模式"EAP"转换为另一种模式,即TAP.一个更简单的解决方案是使用.Net从APM模式到TAP的内置"转换" Task.Factory.FromAsync(内部使用TaskCompletionSource):

APM

socket.BeginConnect(host, port, asyncResult =>
{
    socket.EndConnect(asyncResult);
    Console.WriteLine("Socket connected");
}, null);
Run Code Online (Sandbox Code Playgroud)

TAP

await Task.Factory.FromAsync(socket.BeginConnect, socket.EndConnect, host, port, null);
Console.WriteLine("Socket connected");
Run Code Online (Sandbox Code Playgroud)

  • @iguanaman:实际需要`SocketEventArgs` API的应用程序数量非常小.你应该使用`FromAsync`,除非你发现*需要*来减少垃圾收集,在这种情况下你可以使用[Toub的包装](http://blogs.msdn.com/b/pfxteam/archive/2011/12/15 /10248293.aspx).但同样,它们比"FromAsync"更难使用,而且99.99%或更多的应用程序完全过度杀伤. (2认同)
  • @iguanaman:我会说它没有资格,直到你运行一个分析器证明它确实如此. (2认同)