2013-10-03 12 views
5

Làm cách nào để sử dụng nhà máy Task.Factory.FromAsync cho phương thức kết thúc trả về nhiều giá trị thông qua tham số "ngoài"?Task.Factory.FromAsync với tham số "out" trong Phương thức kết thúc

Các bắt đầu phương pháp có chữ ký này:

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

phương pháp End là:

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

Tôi có thể một số cách sử dụng:

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

Đó không phải là cuộc gọi APM End *** chuẩn, vì vậy các phương thức FromAsync sẽ không hoạt động. –

Trả lời

6

Không có FromAsync quá tải mà sẽ làm việc cho điều này. Lựa chọn tốt nhất có khả năng sẽ được xây dựng wrapper của riêng bạn:

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

Câu hỏi, nếu 'theClass.EndGetCaseStatus' đặt ra một ngoại lệ, bạn cần phải bọc nó với try-catch và chuyển ngoại lệ sang' tcs.SetException ('? –

+1

@ScottChamberlain Có, và nếu có cách nào đó để hủy, bạn cũng nên thiết lập cờ hủy bỏ ('tcs.SetCancelled()') .Đây là trình bao bọc đơn giản nhất có thể để có được ý tưởng, mặc dù. –

+0

"Không có quá tải' FromAsync' có thể làm việc cho điều này. "Không trực tiếp, nhưng bạn có thể làm cho nó hoạt động với một chút nỗ lực (xem câu trả lời của tôi). – svick

5

Tham số endMethod của FromAsync() là một đại biểu, vì vậy bạn có thể sử dụng một lambda để chuyển đổi out Phi Luật Tân với hình thức bình thường của -End phương pháp. Một cái gì đó như:

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

Mặc dù bạn có thể muốn sử dụng loại tùy chỉnh thay vì Tuple.

Các vấn đề liên quan