2016-04-06 7 views
0

Ich muss, sagen wir, 20 parallele Aufgaben ausführen. Die Taskfunktion, die aufgerufen wird, ist eine lange laufende Funktion und kann Fehler erzeugen. Ich wollte das vom Anrufer erkennen und die Aufgabe wiederbeleben.Erkennen von Fehlern in Aufgaben und Wiederbeleben

Während ich verstehe, dass die Behandlung der Ausnahme "innerhalb der Aufgabe" und Ausführen der Aufgabe eine Lösung ist, habe ich auch überlegt, ob es Mittel gibt, dies vom Aufrufer selbst zu erkennen und die fehlgeschlagene Aufgabe erneut auszuführen. Wenn ich die Aufgabe wieder zu beleben sollte es unter den Eimer von 20 Aufgaben fallen ausgeführt wird, so dass der anrufende Prozess für alle Aufgaben warten weiterhin einschließlich läuft die neue wieder Aufgabe über Await Task.WhenAll(tasks)

Hier den Code auf der Anruferseite, die 20 erzeugt andere Aufgabe und wartet auf sie alle zu beenden.

PS: Ich habe die untenstehenden Links für eine Lösung überprüft, aber habe nicht etwas passendes gefunden, das ich versuchen könnte. Aber definitiv würde denken, eine andere Methode könnte sein, die TaskContinuationOptions Option zu verwenden, aber bin mir wirklich nicht sicher, wie und wo das in meinen Code oben passen würde.

Task Parallel Library - How do you get a Continuation with TaskContinuationOptions.OnlyOnCanceled to Fire?

catching parallel tasks if they stop prematurely

Antwort

1

Ich denke, dass es im Inneren des Task ist die beste Option zu tun, aber dass Sie bedeutet nicht, GetAndProcessMessagesAsync zu ändern. Der Code könnte wie folgt aussehen:

Async Function RetryAsync(func As Func(Of Task)) As Task 
    While True 
     Try 
      Await func() 
     Catch 
      ' TODO: don't catch all exceptions all the time 
     End Try 
    End While 
End Function 

… 

Dim tasks = Enumerable.Range(1, 20).Select(
    Function(i) Task.Run(
     Function() RetryAsync(
      Function() GetAndProcessMessagesAsync(cs.Token)))) 

Auch wenn GetAndProcessMessagesAsync wirklich asynchron ist, könnten Sie nicht, dass Task.Run benötigen.

+0

Perfekt, genau das, was ich gesucht habe. Danke vielmals. – Kallol