2013-08-21 10 views
5

W pracy utknąłem w wersji 3.5, ale korzystamy z asyncbridge dla async-await. Używamy wielu starych asynchronicznych wywołań WCF i chcę zawinąć to w nowy wzór async-await.WCF 3.5, AsyncBridge. Owiń w oczekujące

mam zawijania to w następujący sposób:

// 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;    
    } 

są następujące wygenerowano w proxy 3,5 WCF:

GetScannedDocumentsAsync GetScannedDocumentsCompleted GetScannedDocumentsEventArgs

Coś mi mówi, że można to zrobić dużo czystszego, czy brakowało mi czegoś poważnego?

Czy ta metoda w ogóle wykona asynchroniczne? Kompilacja z operatorem asynchronicznym generuje tylko błąd.

+1

Czy 'GetScannedDocumentsAsync' zwraca' IAsyncResult'? Jeśli tak, [this] (http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx) doskonały blog opisuje, jak zrobić to dobrze. – Noseratio

+0

'asynchroniczny' jest dozwolony tylko dla metod, które mają w sobie' await'. Jaka jest definicja "GetScannedDocumentsAsync"? –

+0

Jeśli uważasz, że 'asynchroniczne' jest wymagane, aby metoda faktycznie wykonywała się asynchronicznie, to faktycznie nie wiesz, co oznacza' asynchronizm'. Prawdopodobnie powinieneś przeczytać więcej na ten temat. – svick

Odpowiedz

6

Powinieneś także uzyskać BeginGetScannedDocuments i , które można owinąć za pomocą TaskFactory.FromAsync. Mam wpis na blogu, który pokazuje how to use task wrappers with old-school (pre-4.5) WCF (zarówno na serwerze, jak i na kliencie).

+0

Z pomocą Skeeta znalazłem to w innym wątku, co uprościło wiele rzeczy i pozwoliło mi użyć tyle parametrów, ile chcę. Oznaczono również jako odpowiedź :) –

Powiązane problemy