5

「out」パラメータを介して複数の値を返す end メソッドに Task.Factory.FromAsync ファクトリを使用するにはどうすればよいですか?

begin メソッドには次のシグネチャがあります。

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(?, ?));
}
4

2 に答える 2

7

endMethodパラメータFromAsync()はデリゲートであるため、ラムダを使用してout-form をメソッドの通常の形式に変換できます-End。何かのようなもの:

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.

于 2013-10-04T00:36:12.533 に答える
7

これに有効なオーバーロードはありませんFromAsync。最良のオプションは、独自のラッパーを作成することです。

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;
}
于 2013-10-03T23:18:08.917 に答える