2012-01-04 73 views
5

使用Visual Studio异步CTP(版本3)我很努力地理解如何使用此框架“包装”现有代码。使用Microsoft Async Framework的基础知识

例如

使用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()方法?但就我看来,这可以让我头脑发热。任何人都可以指出正确的方向吗?

+0

Async CTP引入的东西不是框架AFAIK,是吗? – tugberk 2012-01-04 19:08:26

回答

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; 
     } 
    ); 
} 
3

从根本上说,为了从异步CTP中获得最大的收益,您可以真正使用异步调用。您可以在任务换你同步ConnectSync方法很容易,不使用异步CTP在所有:

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

(这有可能是你没有在这里指定类型参数 - 我永远记得使用方法组转换进行类型推断的确切规则。)

这仍然会在连接时锁定线程。如果你没有问题,那么至少你会得到一种方法,你可以用异步方法调用并且适当地等待。如果没有别的,这将允许您使用异步向上构建应用程序的其余部分,然后如果/当POP3代码支持异步,则可以将ConnectAsync重写为异步方法。