2015-06-08 6 views
5

Devo chiamare il numero asincrono di delegati per la stessa funzione. La domanda è come dovrei trattare la funzione di richiamata? abbiamo un paio di delegati in esecuzione, quindi CallbackMethod non significa che tutti i delegati asincroni abbiano finito.Chiamata asincrona per delegato nel ciclo

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 verrà chiamato per ogni chiamata di instance.dummyMethod. Se è necessario attendere fino al completamento di tutte le chiamate nel thread principale, è possibile aggiungere tutte le IAsyncResult a un elenco e quindi eseguire il polling di ciascun elemento nel ciclo chiamando IAsyncResult.IsComplete o utilizzare il metodo WaitHandle.WaitAll –

risposta

0

Vorrei prendere in considerazione cercando di utilizzare Task s forniti con 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 }); 

tutti L'WaitAll assicura che tutte Task s sono fatte prima di proseguire il filo principale. Quanto sopra consente di implementare singoli callback.

utilizzare alternativa, un singola richiamata quando Tutti i metodi asincroni sono stati compilati:

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

sarei propenso ad utilizzare Framework reattiva di Microsoft (NuGet "Rx-principale") per questo come sarebbe essere molto più semplice

Ecco il codice:

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

Il metodo .Subscribe ha una funzione di callback per ogni valore dummy prodotto così come un callback "fatto" quando sono stati restituiti tutti i valori.

La query viene eseguita automaticamente su più thread.