Gig*_*igi 8 c# asynchronous task async-await
.NET中有许多类使用旧的异步编程模型(APM),"不再推荐用于新开发".APM使用Begin/End方法对,End方法将IAsyncResult对象作为参数.一个这样的类是TcpClient,您可以使用它来异步连接,如下所示:
private void SomeMethod()
{
this.tcpClient = new TcpClient();
IAsyncResult result = this.tcpClient.BeginConnect(ip, port, EndConnect, null);
}
private void EndConnect(IAsyncResult asyncResult)
{
this.tcpClient.EndConnect(asyncResult);
// ... do stuff ...
}
Run Code Online (Sandbox Code Playgroud)
基于任务的异步模式(TAP)是一种更现代的异步编程形式,通过使用async和await关键字来促进.
因此,如果您有一个类似TcpClient的类,它使用APM模型并且不公开任何任务,那么如何将其异步方法调整到TAP以便它们可以与async/ 一起使用await?
Ste*_*ary 13
作为一般规则,您应首先查看或询问有关直接支持TAP的更新API.几乎所有的BCL类都已经更新以支持TAP,并且少数(例如HttpWebRequest)已被TAP替代(例如HttpClient)替换.在这种情况下,没有TAP TcpClient等价物,所以包装它们是最好的选择.
如果您通过APM包装器编写TAP,我建议使用简单的扩展方法:
public static Task ConnectTaskAsync(this TcpClient client, IPAddress address, int port)
{
return Task.Factory.FromAsync(client.BeginConnect, client.EndConnect, address, port, null);
}
Run Code Online (Sandbox Code Playgroud)
这为您提供了一种使用它们的自然方式,并将您的"互操作"代码与包含实际逻辑的任何代码分开:
async Task SomeMethodAsync()
{
this.tcpClient = new TcpClient();
await this.tcpClient.ConnectTaskAsync(ip, port);
// ... do stuff ...
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Task.Factory.FromAsync它。示例(用于BeginReceive/ EndReceive):
public static class SocketsExt
{
static public Task ReceiveDataAsync(
this TcpClient tcpClient,
byte[] buffer)
{
return Task.Factory.FromAsync(
(asyncCallback, state) =>
tcpClient.Client.BeginReceive(buffer, 0, buffer.Length,
SocketFlags.None, asyncCallback, state),
(asyncResult) =>
tcpClient.Client.EndReceive(asyncResult),
null);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2922 次 |
| 最近记录: |