2012-11-18 72 views
3

我想重新使用我的许多APM风格的异步方法的代码。每种方法都有一个BeginXXX和一个EndXXX签名对。我想在每个函数中重复使用相同的回调函数。如何与许多APM BeginXXX调用共享一个AsyncCallback?

我一直使用匿名方法,如下所示,但我不知道如何将其提取到可重用的表单中。我知道这应该很容易,但我无法弄清楚如何使用委托来实现这一点。 (这是我得到正在自学)

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) => ...匿名方法到委托并使其可重复使用?

回答

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

我一直在战斗2天;这正是我需要的! (x 100万) – LamonteCristo

+0

非常欢迎:)这种疯狂虽然证明了为什么异步/等待在C#5中真棒。 – BFree

+0

我正在实现这个,'var response = state.CloudTable.EndExecuteQuerySegmented();'需要在最后一个方法中使用IAsyncResult。我应该放什么? – LamonteCristo