使用Microsoft异步框架的基础知识
本文关键字:基础知识 框架 异步 Microsoft 使用 | 更新日期: 2023-09-27 18:19:35
使用Visual Studio Async CTP(版本3)我很难理解如何使用此框架"包装"现有代码。
例如
使用OpenPop.NET库,我正在尝试与pop3服务器建立连接,并确认我有有效的用户名和密码。
假设我有这样的代码。
public bool ConnectSync()
{
bool success = true;
Pop3Client client = new Pop3Client();
try
{
client.Connect("mail.server.com", 110, false);
client.Authenticate("username", "password");
}
catch
{
success = false;
}
return success;
}
现在,我想让它异步化。我从阅读和拼凑的内容中了解到,我最终会得到一个类似的方法签名
public async Task<bool> ConnectAsync()
{
}
我相信这是正确的签名,因为它将是一个返回布尔值(?)的任务,我的猜测是我需要使用TaskEx.Run()方法?但这似乎是我所能想到的。有人能指出正确的方向吗?
是的,到目前为止你是对的。
正如您所说,转换方法的简单方法是将其封装在TaskEx.Run
中,这样方法就可以在线程池线程上运行,而不会阻塞UI线程。
public Task<bool> ConnectAsync()
{
return TaskEx.Run( () =>
{
bool success = true;
Pop3Client client = new Pop3Client();
try
{
client.Connect("mail.server.com", 110, false);
client.Authenticate("username", "password");
}
catch
{
success = false;
}
return success;
}
);
}
从根本上讲,为了从异步CTP中获得最大的好处,您可以一直使用异步调用。您可以非常容易地将同步ConnectSync
方法封装在任务中,而无需使用异步CTP:
// Note: not an async method in itself
public Task<bool> ConnectAsync()
{
return Task.Factory.StartNew<bool>(ConnectSync);
}
(你可能不必在这里指定类型参数——我永远记不清使用方法组转换进行类型推理的确切规则了。)
不过,当它连接时,这仍然会把一根线绑起来。如果你对此满意,那么至少你最终会得到一个方法,你可以从异步方法调用并适当地等待。如果没有其他内容,这将允许您使用async向上构建应用程序的其余部分,然后如果POP3代码支持async,则可以将ConnectAsync
重写为async方法。