2015-06-08 1 views
5

Ich muss asynchrone Anzahl der Delegaten für die gleiche Funktion aufrufen. Die Frage ist, wie sollte ich die Rückruffunktion behandeln? Wir haben einige Delegierte, die so ausgeführt werden, dass CallbackMethod nicht bedeutet, dass alle asynchronen Delegierten beendet sind.Async-Aufruf für Delegat in Zyklus

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 wird für jeden Aufruf von instance.dummyMethod aufgerufen. Wenn Sie warten müssen, bis alle Aufrufe in Ihrem Hauptthread abgeschlossen sind, können Sie alle IAsyncResult einer Liste hinzufügen und dann jedes Element in der Schleife abfragen, indem Sie IAsyncResult.IsComplete aufrufen oder WaitHandle.WaitAll Methode verwenden –

Antwort

0

Ich würde bei Verwendung Task s zur Verfügung gestellt mit TPL suchen.

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 alle sicher, dass alle Task s, bevor Sie fortfahren auf dem Hauptthread fertig sind. Mit dem obigen können Sie einzelne Rückrufe implementieren.

Alternativ einen Rückruf verwenden, wenn Alle die Asynchron-Methoden sind vollständig:

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

ich geneigt sein würde Microsofts Reactive Framework (NuGet „Rx-Main“) dafür, wie es wäre zu verwenden sei so viel einfacher.

Hier ist der Code:

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

Die .Subscribe Methode hat einen Rückruf für jeden auch produziert dummy Wert als „done“ Rückruf, wenn alle Werte zurückgegeben wurden.

Die Abfrage wird automatisch für mehrere Threads ausgeführt.