2012-01-04 3 views
5

Visual Studio非同期CTP(バージョン3)を使用するこのフレームワークを使用して既存のコードをどのように「ラップする」ことができるか理解するのは苦労しています。例Microsoft Async Frameworkを使用する際の基本

私は、POP3サーバーとの接続を確立し、私は有効なユーザー名とパスワードを持って確認しようとしていますOpenPop.NETライブラリを使用するための

私はこのようなコードをいくつか持っています。

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

答えて

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の利点を最大限に活用するためには、非同期呼び出しを使用して実際に行うことができます。私が覚えていることはできません -

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

(それはあなたがここに型引数を指定する必要はありません可能性があります:あなたは全く非同期CTPを使用せずに、非常に簡単にタスクにあなたの同期ConnectSyncメソッドをラップすることができますメソッドグループ変換を使用した型推論の正確な規則)

これは、接続中でもスレッドを結びつけます。もしあなたがそれで大丈夫ならば、少なくともというメソッドで非同期メソッドからを呼び出し、適切に待つことになります。それ以外の場合は、asyncを使用してアプリケーションの残りの部分を作成し、POP3コードが非同期をサポートする場合は、ConnectAsyncを非同期メソッドに書き換えることができます。

関連する問題