2012-01-04 71 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重寫爲異步方法。