我想用许多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) => ...
的匿名方法提取到委托中并使其可重用?
答案 0 :(得分:3)
您将创建一个包含所有“捕获”变量的类作为状态传递:
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);