2015-06-08 42 views
5

我需要异步调用相同功能的代理人数。 问题是我应该如何处理回拨函数? 我们有几个代表正在运行,所以CallbackMethod并不意味着所有的异步代理都完成了。异步调用代理周期

AsyncMethodCaller c = new AsyncMethodCaller(instance.dummyMethod); 
for (int i = 0; i < 100; i++) 
    { 
     IAsyncResult res = c.BeginInvoke(5000, 
      out dummy, 
      new AsyncCallback(CallbackMethod), 
      "executed on thread {0}, with result value \"{1}\"."); 
} 
+0

每次调用instance.dummyMethod时都会调用CallbackMethod。如果您需要等待主线程中的所有调用完成,则可以将所有IAsyncResult添加到列表中,然后通过调用IAsyncResult.IsComplete或使用WaitHandle.WaitAll方法来轮询循环中的每个项目 –

回答

0

我会考虑考虑使用带有TPLTask秒。

var task1 = Task.Run(() => instance.dummyMethod) 
    .ContinueWith((completedTask) => Console.WriteLine("Each callback here. Result: " + completedTask.Result)); 

// Blocks calling thread until all tasks are done. 
Task.WaitAll(new [] { task1, task2 }); 

WaitAll都确保所有Task s的继续在主线程之前完成。以上允许您实现个别回调。

或者使用一个回调所有异步方式完成:

Task.Factory.ContinueWhenAll(new [] { task1, task2 }, 
    (allTasks) => Console.WriteLine("Callback when all are done.")); 
0

我会倾向于使用微软的反应框架(的NuGet“RX-主”)这个,因为它会要简单得多。

下面的代码:

var query = 
    from n in Observable.Range(0, 100) 
    from dummy in Observable.Start(() => instance.dummyMethod()) 
    select dummy; 

query 
    .Subscribe(
     dummy => 
     { 
      Console.WriteLine(dummy.ToString()); 
     }, 
     () => 
     { 
      Console.WriteLine("Done."); 
     }); 

.Subscribe方法对生产以及何时已返回所有值“完成”回调每个dummy值的回调。

该查询会自动为您在多个线程上运行。