2013-08-21 17 views
5

私は現在3.5で立ち往生していますが、asyncbridgeをasync-awaitに使用しています。私たちは古いWCF非同期呼び出しをたくさん使っています。これを新しい非同期待機パターンにまとめたいと思います。WCF 3.5、AsyncBridge。 async-awaitをラップする

// async is wrong 
    public /*async*/ Task<ScannedDocumentResult> GetScannedDocumentsTask(String assignmentId) 
    { 
     TaskCompletionSource<ScannedDocumentResult> tcs = new TaskCompletionSource<ScannedDocumentResult>(); 
     EventHandler<GetScannedDocumentsCompletedEventArgs> handler = null; 
     handler = (o, e) => 
      { 
       if (e.UserState != tcs) 
        return; 

       if (e.Error != null) 
        tcs.SetException(e.Error); 
       else if (e.Cancelled) 
        tcs.SetCanceled(); 
       else 
        tcs.SetResult(e.Result); 

       GetScannedDocumentsCompleted -= handler; 
      }; 
     GetScannedDocumentsCompleted += handler; 
     GetScannedDocumentsAsync(assignmentId, tcs); 

     return tcs.Task;    
    } 

3.5 WCFプロキシにgeneretedは次のとおりです:

何かが私に語っ

GetScannedDocumentsAsync GetScannedDocumentsCompleted GetScannedDocumentsEventArgsこれを行うことができることを次のように

私はこれをラップしています多くのクリーナー、私は何かを逃したことがありますか?

また、このメソッドはasyncをまったく実行しますか? async演算子でコンパイルするとエラーが発生します。

+1

'GetScannedDocumentsAsync'は' IAsyncResult'を返しますか?もしそうなら、[this](http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx)の優れたブログ記事では、それを正しく行う方法が説明されています。 – Noseratio

+0

'async'はその中に' await'を持つメソッドでのみ許可されます。 'GetScannedDocumentsAsync'の定義は何ですか? –

+0

実際に非同期で実行するメソッドに 'async'が必要だと思うのであれば、' async'の意味を実際に理解していません。あなたはおそらくそれについてもっと読むべきです。 – svick

答えて

6

また、TaskFactory.FromAsyncを使用して折り返すことができるBeginGetScannedDocumentsEndGetScannedDocumentsが必要です。私はhow to use task wrappers with old-school (pre-4.5) WCF(両方のサーバーとクライアント)を示すブログの投稿があります。

+0

Skeetの助けを借りて、別のスレッドでこれを理解しました。これは、多くのことを単純化し、私が望むように多くのパラメータを使用できるようにしました。あなたにも同様に回答としてマークしました:) –

関連する問題