2013-08-21 4 views
5

Au travail, je suis actuellement coincé dans 3.5, mais nous utilisons asyncbridge pour async-await. Nous utilisons beaucoup d'anciens appels asynchrones WCF, et je veux envelopper dans le nouveau modèle async-waiting.WCF 3.5, AsyncBridge. Wrap in async-await

J'enroulant cela comme suit:

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

Les suivants sont genereted dans le proxy 3.5 WCF:

GetScannedDocumentsAsync GetScannedDocumentsCompleted GetScannedDocumentsEventArgs

Quelque chose me dit que cela peut être fait beaucoup plus propre, ai-je manqué quelque chose de cru?

De même, cette méthode va-t-elle exécuter async? La compilation avec l'opérateur async génère simplement une erreur.

+1

Est-ce que 'GetScannedDocumentsAsync' renverra' IAsyncResult'? Si c'est le cas, [cet article (http://blogs.msdn.com/b/pfxteam/archive/2011/06/27/10179452.aspx) excellent blog explique comment le faire correctement. – Noseratio

+0

'async' n'est autorisé que sur les méthodes qui ont' await' à l'intérieur. Quelle est la définition de 'GetScannedDocumentsAsync'? –

+0

Si vous pensez que 'async' est requis pour qu'une méthode s'exécute réellement de façon asynchrone, alors vous ne comprenez pas vraiment ce que' async' veut dire. Vous devriez probablement en lire plus à ce sujet. – svick

Répondre

6

Vous devriez également obtenir un BeginGetScannedDocuments et EndGetScannedDocuments, que vous pouvez envelopper à l'aide de TaskFactory.FromAsync. J'ai un billet de blog qui montre how to use task wrappers with old-school (pre-4.5) WCF (à la fois sur le serveur et le client).

+0

Avec l'aide de Skeet, j'ai compris cela dans un autre thread, ce qui simplifiait beaucoup les choses + m'a permis d'utiliser autant de paramètres que je le voulais. Vous avez également marqué comme une réponse :) –

Questions connexes