2013-10-03 18 views
5

Task.Factory.FromAsync fabrikasını "out" parametreleriyle birden çok değer döndüren bir son yöntem için nasıl kullanırım?Task.Factory.FromAsync, "Son" Yöntemde "out" parametreleriyle

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

Bitiş yöntemidir: yöntemini başlamak

bu imzası vardır

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

Can Bazı nasıl kullanılması:

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

Bu standart bir APM End *** çağrısı değil, dolayısıyla FromAsync yöntemleri çalışmaz. –

cevap

6

çalışacak hiçbir FromAsync aşırı yük yoktur bunun için. En iyi seçenek muhtemelen kendi sarıcı inşa etmek olacaktır: Eğer -End yöntemlerin normal formuna out -formunu dönüştürmek için bir lambda kullanabilirsiniz böylece

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

Soru, "TheClass.EndGetCaseStatus" bir istisnayı artırırsa, bunu bir try-catch ile sarmanız ve istisnayı 'tcs.SetException ('? –

+1

@ScottChamberlain Evet'e iletmeniz gerekiyorsa) ve iptal etmek için bir yol varsa, Ayrıca, iptal bayrağını da ('tcs.SetCancelled()') ayarlamalıdır.Aynı zamanda bu fikri elde edebilmek için en basit sarıcıdır. –

+0

“FromAsync 'aşırı yükü bunun için çalışacaktır.” Doğrudan değil, fakat biraz çaba ile çalışabilirsiniz (cevabıma bakın). – svick

5

FromAsync() ait endMethod parametresi, bir delege. gibi bir şey:

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

muhtemelen özel bir yerine Tuple arasında yazın kullanmak istediğiniz rağmen

.