加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从异步编程模型(APM)迁移到基于任务的异步模式(TAP)

发布时间:2020-12-15 08:11:49 所属栏目:百科 来源:网络整理
导读:.NET中有许多类使用旧的 Asynchronous Programming Model (APM),“不再推荐用于新开发”. APM使用Begin / End方法对,End方法将 IAsyncResult对象作为参数.一个这样的类是 TcpClient,您可以使用它来异步连接,如下所示: private void SomeMethod(){ this.tcpC
.NET中有许多类使用旧的 Asynchronous Programming Model (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 ...
}

Task-based Asynchronous Pattern (TAP)是一种更现代的异步编程形式,通过使用async和await关键字来促进.

因此,如果您有一个类似TcpClient的类,它使用APM模型并且不公开任何任务,那么如何将其异步方法适配到TAP以便它们可以与async / await一起使用?

解决方法

这是 in the documentation you linked to.

作为一般规则,您应首先查看或询问是否有直接支持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,null);
}

这为您提供了一种使用它们的自然方式,并将您的“互操作”代码与包含实际逻辑的任何代码分开:

async Task SomeMethodAsync()
{
  this.tcpClient = new TcpClient();
  await this.tcpClient.ConnectTaskAsync(ip,port);
  // ... do stuff ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读