2013-10-03 5 views
5

"out"매개 변수를 통해 여러 값을 반환하는 end 메서드에 대해 Task.Factory.FromAsync 팩토리를 사용하려면 어떻게해야합니까?End 메서드의 "out"매개 변수가있는 Task.Factory.FromAsync

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

종료 방법은 다음과 같습니다 : (가) 방법을 시작

이 서명이

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

수 있습니까 몇 가지 방법을 사용 :

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

표준 APM End *** 호출이 아니므로 FromAsync 메서드가 작동하지 않습니다. –

답변

6

일하는 것이 더 FromAsync 과부하가 없다 이것 때문에. 최선의 선택은 가능성이 자신의 래퍼를 구축하는 것입니다 : 당신이 -End 방법의 일반적인 형태로 out 형을 변환하는 람다를 사용할 수 있도록

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

질문. 'theClass.EndGetCaseStatus'가 예외를 발생시키는 경우 try-catch로 감싸고 예외를'tcs.SetException ('? –

+1

@ScottChamberlain 예, 전달할 수 있습니다. 취소 할 수있는 방법이 있으면 그래도 취소 플래그 ('tcs.SetCancelled()')를 설정해야합니다.이 아이디어는 가장 간단한 래퍼입니다. –

+0

"이 작업에 사용할 수있는'FromAsync' 오버로드가 없습니다." 당신은 약간의 노력으로 그것을 작동하게 할 수 있습니다. (제 답변을보십시오). – svick

5

FromAsync()endMethod 매개 변수는 대리자입니다. 같은 뭔가 :

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

당신은 아마 사용자 정의 대신 Tuple의 입력에 사용할하지만

.

관련 문제