3 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超6個(gè)贊
以我的經(jīng)驗(yàn),TaskCompletionSource非常適合將舊的異步模式包裝到現(xiàn)代async/await模式。
我能想到的最有益的例子是使用Socket。它具有舊的APM和EAP模式,但沒有和具有的awaitable Task方法。TcpListenerTcpClient
我個(gè)人在NetworkStream班上有幾個(gè)問題,更喜歡原始課程Socket。由于我也喜歡該async/await模式,因此我SocketExtender創(chuàng)建了一個(gè)擴(kuò)展類,該類為創(chuàng)建了幾個(gè)擴(kuò)展方法Socket。
所有這些方法都利用TaskCompletionSource<T>來包裝異步調(diào)用,如下所示:
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方法,使我獲得稍許的性能提升出來的沒有扯起本地參數(shù)的編譯器。
那么這一切的美麗:
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 關(guān)注
- 1363 瀏覽
添加回答
舉報(bào)