2013-08-21 64 views
5

在工作中,我目前停留在3.5,但我們正在使用asyncbridge進行異步等待。我們使用了很多舊的WCF異步調用,並且我想將其包裝到新的異步等待模式中。WCF 3.5,AsyncBridge。包裝異步等待

我這個包裹如下:

// 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操作符編譯只會產生一個錯誤。

+1

'GetScannedDocumentsAsync'是否返回'IAsyncResult'?如果是這樣,[本](http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx)優秀的博客文章介紹瞭如何做到這一點。 – Noseratio

+0

'async'只能在內部有'await'的方法上使用。 'GetScannedDocumentsAsync'的定義是什麼? –

+0

如果您認爲異步執行方法需要'async',那麼您實際上並不理解'async'的含義。你應該多讀些關於它。 – svick

回答

6

你也應該得到一個BeginGetScannedDocumentsEndGetScannedDocuments,你可以使用TaskFactory.FromAsync包裝。我有一個博客文章,顯示how to use task wrappers with old-school (pre-4.5) WCF(在服務器和客戶端)。

+0

在Skeet的幫助下,我在另一個線程中弄清楚了這一點,這簡化了很多事情+允許我使用盡可能多的參數。雖然:)也標記爲答案:) –