3 回答
TA贡献1811条经验 获得超6个赞
以我的经验,TaskCompletionSource非常适合将旧的异步模式包装到现代async/await模式。
我能想到的最有益的例子是使用Socket。它具有旧的APM和EAP模式,但没有和具有的awaitable Task方法。TcpListenerTcpClient
我个人在NetworkStream班上有几个问题,更喜欢原始课程Socket。由于我也喜欢该async/await模式,因此我SocketExtender创建了一个扩展类,该类为创建了几个扩展方法Socket。
所有这些方法都利用TaskCompletionSource<T>来包装异步调用,如下所示:
public static Task<Socket> AcceptAsync(this Socket socket)
{
if (socket == null)
throw new ArgumentNullException("socket");
var tcs = new TaskCompletionSource<Socket>();
socket.BeginAccept(asyncResult =>
{
try
{
var s = asyncResult.AsyncState as Socket;
var client = s.EndAccept(asyncResult);
tcs.SetResult(client);
}
catch (Exception ex)
{
tcs.SetException(ex);
}
}, socket);
return tcs.Task;
}
我传递socket到BeginAccept方法,使我获得稍许的性能提升出来的没有扯起本地参数的编译器。
那么这一切的美丽:
var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Loopback, 2610));
listener.Listen(10);
var client = await listener.AcceptAsync();
- 3 回答
- 0 关注
- 1335 浏览
添加回答
举报