2015-06-08 2 views
5

Мне нужно вызвать асинхронное число делегатов для одной и той же функции. Вопрос в том, как я должен обрабатывать функцию обратного вызова? У нас есть пара делегатов, которые работают так, что CallbackMethod не означает, что все делегаты async закончены.Асинхронный вызов для делегата в цикле

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

CallbackMethod будет вызываться для каждого вызова instance.dummyMethod. Если вам нужно подождать, пока все вызовы не будут завершены в вашем основном потоке, вы можете добавить весь список IAsyncResult в список, а затем опросить каждый элемент в цикле, вызвав IAsyncResult.IsComplete или использовать метод WaitHandle.WaitAll –

ответ

0

Я хотел бы рассмотреть глядя на использование Task сек снабженных TPL.

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

The WaitAll все гарантирует, что все Task s сделаны, прежде чем продолжить в главном потоке. Вышеупомянутое позволяет реализовать отдельные обратные вызовы.

В качестве альтернативы использовать обратный вызов когда Все методы асинхронных являются полными:

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

я был бы склонен использовать Реактивная Framework от Microsoft (NuGet «Rx-Main») для этого, как это было бы быть намного проще.

Вот код:

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 стоимости производства, а также «сделано» обратного вызова, когда все значения были возвращены.

Запрос выполняется для нескольких потоков автоматически для вас.

Смежные вопросы