c# - 非同期 - AsyncCallbackを多くのAPM BeginXXXコールと共有するにはどうすればよいですか?



iasyncresult (1)

私は多くのAPMスタイルの非同期メソッドでコードを再利用したい。 各メソッドには、BeginXXXとEndXXXシグネチャのペアがあります。 私はそれぞれの関数で同じコールバックを再利用したい。

私はいつも以下のような匿名メソッドを使用してきましたが、再利用可能なフォームに抽出する方法がわかりません。 私はこれが簡単であるべきだと知っていますが、これを実現するためにデリゲートを使う方法を理解することはできません。 (これは私が独学で学ぶために得たものです)

 var result = tableSymmetricKeys.BeginExecuteQuerySegmented(query, token, opt, ctx, (o) =>
                {
                    var response = (o.AsyncState as CloudTable).EndExecuteQuerySegmented(o);
                    token = response.ContinuationToken;
                    int recordsRetrieved = response.Results.Count;
                    totalEntitiesRetrieved += recordsRetrieved;
                    Console.WriteLine("Records retrieved in this attempt = " + recordsRetrieved + " | Total records retrieved = " + totalEntitiesRetrieved);
                    evt.Set();
                }, tableSymmetricKeys);

デリゲートに(o) => ...を持つ匿名メソッドを抽出して再利用可能にするにはどうすればよいですか?


すべての "取得された"変数を状態としてパスするクラスを作成します。

public class QueryState
{
   public CloudTable CloudTable{get;set;}
   public Token Token{get;set;}
   public class ManualResetEvent Evt{get;set;} //i'm guessing that's what this is
   //any other variables you were using
}

次に、次のようなデリゲートを作成します。

AsyncCallback asyncCallback = (asyncResult) =>
{
   QueryState state = asyncResult.State as QueryState;
   var response = state.CloudTable.EndExecuteQuerySegmented(asyncResult);
   //rest of method... make sure to use the state variable to get whatever you need.
}

最後に、あなたはこれを次のように呼んでいます:

var state = new QueryState
{
   CloudTable = tableSymmetricKeys,
   //set everything else
}

var result = tableSymmetricKeys.BeginExecuteQuerySegmented(query, token, opt, ctx,asyncCallback, state);




asynccallback