.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 ... }
原文地址:https://www.jb51.cc/csharp/101071.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。