2013-10-03 6 views
5

Wie verwende ich die Task.Factory.FromAsync-Factory für eine Endmethode, die mehrere Werte über "out" -Parameter zurückgibt?Task.Factory.FromAsync mit "out" -Parametern in der Endmethode

Verfahren beginnen hat diese Unterschrift:

public virtual System.IAsyncResult BeginGetCaseStatus(int CaseOID, int ClientOID, System.AsyncCallback @__Callback, object @__UserData) 

End Methode ist:

public virtual void EndGetCaseStatus(System.IAsyncResult @__AsyncResult, out DTGenericCode[] BasicStatus, out DTGenericCode[] ARStatus) 

Kann ich einige, wie Verwendung:

public Task<?> GetCaseStatusAsync(int CaseOID, int ClientOID) 
{ 
    return Task.Factory.FromAsync (BeginGetCaseStatus(CaseOID, ClientOID, null, null), EndGetCaseStatus(?, ?)); 
} 
+1

Das ist kein standardmäßiger APM-End *** -Aufruf, daher funktionieren die FromAsync-Methoden nicht. –

Antwort

6

Es gibt keine FromAsync Überlastung, die funktionieren würde dafür. Die beste Option wäre wahrscheinlich Ihre eigenen Wrapper zu bauen:

public class ResultStatus 
{ 
    public ResultStatus(DTGenericCode[] basicStatus, DTGenericCode[] arStatus) 
    { 
     this.BasicStatus = basicStatus; 
     this.ARStatus = arStatus; 
    } 
    public DTGenericCode[] BasicStatus { get; private set; } 
    public DTGenericCode[] ARStatus { get; private set; } 
} 

public Task<ResultStatus> GetCaseStatusAsync(int CaseOID, int ClientOID) 
{ 
    var tcs = new TaskCompletionSource<ResultStatus>(); 
    theClass.BeginGetCaseStatus(CaseOID, ClientOID, iar => 
      { 
       DTGenericCode[] bs; 
       DTGenericCode[] as; 
       theClass.EndGetCaseStatus(iar, out bs, out as); 

       tcs.SetResult(new ResultStatus(bs, as)); 
      }, null); 

    return tcs.Task; 
} 
+1

Frage, wenn 'theClass.EndGetCaseStatus' eine Ausnahme auslöst, müssen Sie es mit einem try-catch umbrechen und die Ausnahme an 'tcs.SetException übergeben ('? –

+1

@ScottChamberlain Ja, und wenn es eine Möglichkeit gibt, abzubrechen, Sie sollte auch das Abbruch-Flag setzen ('tcs.SetCancelled()'). Dies war der einfachste mögliche Wrapper, um die Idee zu vermitteln. –

+0

"Es gibt keine' FromAsync' Überladung, die dafür funktionieren würde. "Nicht direkt, aber Sie können es mit ein wenig Aufwand arbeiten lassen (siehe meine Antwort). – svick

5

Der endMethod Parameter von FromAsync() ist ein Delegierter, so dass Sie einen Lambda verwenden können die out -Form in die normale Form von -End Methoden zu konvertieren. Etwas wie:

private static Task<Tuple<DTGenericCode[], DTGenericCode[]>> GetCaseStatusAsync(
    int CaseOID, int ClientOID) 
{ 
    return Task.Factory.FromAsync(
     BeginGetCaseStatus, ar => 
     { 
      DTGenericCode[] basicStatus; 
      DTGenericCode[] arStatus; 

      EndGetCaseStatus(ar, out basicStatus, out arStatus); 

      return Tuple.Create(basicStatus, arStatus); 
     }, 
     CaseOID, ClientOID, null); 
} 

Obwohl Sie wahrscheinlich einen benutzerdefinierten Typ anstelle des Tuple verwenden möchten.

Verwandte Themen