如何与许多APM BeginXXX呼叫共享AsyncCallback?

我想用许多APM风格的异步方法重用我的代码。 每种方法都有一个BeginXXX和一个EndXXX签名对。 我想在每个函数中重用相同的回调。

我一直使用下面的匿名方法,但我不知道如何将其提取为可重用的forms。 我知道这应该很简单,但我无法弄清楚如何使用委托来实现这一目标。 (这就是我自学成才)

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