5

使用 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() 方法?但这就是我所能理解的。谁能指出正确的方向?

4

2 回答 2

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;
        }
    );
}
于 2012-01-04T10:10:30.197 回答
3

从根本上说,为了从异步 CTP 中获得最大收益,您可以一直使用异步调用。您可以非常轻松地将同步 ConnectSync方法包装在任务中,而无需使用异步 CTP:

// Note: not an async method in itself
public Task<bool> ConnectAsync()
{
    return Task.Factory.StartNew<bool>(ConnectSync);
}

(您可能不必在此处指定类型参数 - 我永远记不起使用方法组转换进行类型推断的确切规则。)

尽管如此,它仍然会在连接时占用一个线程。如果您对此感到满意,那么至少您最终会得到一个可以从异步方法调用并适当等待的方法。如果不出意外,这将允许您使用异步向上构建应用程序的其余部分,然后如果/当 POP3 代码支持异步时,您可以重写ConnectAsync为异步方法。

于 2012-01-04T10:11:00.647 回答