Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Microsoft异步框架的基础知识_C#_Asynchronous_Async Ctp - Fatal编程技术网

C# 使用Microsoft异步框架的基础知识

C# 使用Microsoft异步框架的基础知识,c#,asynchronous,async-ctp,C#,Asynchronous,Async Ctp,使用VisualStudioAsyncCTP(版本3),我很难理解如何使用此框架“包装”现有代码 比如说 使用OpenPop.NET库,我试图与pop3服务器建立连接,并确认我拥有有效的用户名和密码 假设我有一些这样的代码 public bool ConnectSync() { bool success = true; Pop3Client client = new Pop3Client(); try {

使用VisualStudioAsyncCTP(版本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()
    {

    }
公共异步任务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;
        }
    );
}
公共任务ConnectAsync()
{
返回TaskEx.Run(()=>
{
布尔成功=真;
POP3客户端=新的POP3客户端();
尝试
{
client.Connect(“mail.server.com”,110,false);
客户端验证(“用户名”、“密码”);
}
抓住
{
成功=错误;
}
回归成功;
}
);
}

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

// Note: not an async method in itself
public Task<bool> ConnectAsync()
{
    return Task.Factory.StartNew<bool>(ConnectSync);
}
//注意:本身不是异步方法
公共任务ConnectAsync()
{
返回Task.Factory.StartNew(ConnectSync);
}
(这里可能不必指定类型参数-我永远记不起使用方法组转换进行类型推断的确切规则。)


但在连接时,它仍然会绑住一根线。如果您对此没有意见,那么至少您将得到一个可以从异步方法调用并适当等待的方法。如果没有其他方法,这将允许您使用async向上构建应用程序的其余部分,然后如果/当POP3代码支持async时,您可以将
ConnectAsync
重写为异步方法。

async CTP引入的东西不是框架,是吗?