使用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;
}
现在我想让我从我读过的东西中理解Async,并且拼凑在一起就是我最终会得到一个方法签名
public async Task<bool> ConnectAsync()
{
}
我相信这是正确的签名,因为它将是一个返回布尔值(?)的任务,我的猜测是我需要使用TaskEx.Run()方法?但就我而言,这似乎让我头晕目眩。有人能指出正确的方向吗?
答案 0 :(得分:3)
是的,到目前为止你是对的。
正如您所说,转换方法的简单方法是将其包装在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;
}
);
}
答案 1 :(得分:3)
从根本上说,为了从异步CTP中获得最大收益,您可以完全使用异步调用。您可以非常轻松地将同步 ConnectSync
方法包装在任务中,而无需使用异步CTP:
// Note: not an async method in itself
public Task<bool> ConnectAsync()
{
return Task.Factory.StartNew<bool>(ConnectSync);
}
(你可能不必在这里指定类型参数 - 我永远不会记住使用方法组转换的类型推断的确切规则。)
虽然在连接时它仍然会占用一个线程。如果你对此没问题,那么至少你会得到一个方法,你可以从异步方法调用并等待适当的方法。如果没有别的,这将允许您使用异步向上构建应用程序的其余部分,然后如果/当POP3代码支持异步时,您只需将ConnectAsync
重写为异步方法。