Ich arbeite an einem Web-Hook in .NET 4.0, das ein Lambda asynchron ausführt und dann das Ergebnis an einen bestimmten URI sendet es ist fertig.
Ich habe das zum Laufen gebracht, aber jetzt möchte ich, dass der Task alle ausgelösten Ausnahmen behandelt und es schwierig findet, sie davon abzuhalten, die Eltern zu erreichen.
Hier ist ein Teil meines Codes:
%Vor% Eine alternative Version, die ich ausprobiert habe, ruft ContinueWith()
zweimal auf, um eine Fortsetzung zu registrieren, um OnlyOnRanToCompletion
auszuführen, und eine, um OnlyOnFaulted
auszuführen. (Ich bin mir nicht sicher, ob ContinueWith()
zweimal korrekt ist.):
Also im Grunde möchte ich einen Weg für jede Aufgabe eigene Ausnahmen über eine Fortsetzungsfunktion behandeln. So wie es steht, wird die HandlException-Fortsetzungsfunktion in keinem der obigen Beispiele aufgerufen.
Ich verursache die Ausnahmen in einem Testfall, und ich sollte erwähnen, dass ich einen Tasks.WaitAll(tasks);
-Aufruf für ein Array von Aufgaben verwende, um sicherzustellen, dass alle Aufgaben abgeschlossen sind, bevor ich meine Behauptungen ausführe, und ich bin mir nicht sicher Wenn dieser Aufruf einen Unterschied macht, wie Ausnahmen von den Tasks behandelt werden. Derzeit löst WaitAll eine AggregationException aus, die die Ausnahmen für die einzelnen Tasks zusammenfasst, da sie nicht von der Fortsetzungsfunktion HandleException behandelt werden.
Eine Taskfortsetzung, die die Ausnahme der Task beobachtet, behandelt die Ausnahme nicht. Es passiert immer noch, wo immer Sie warten, bis die Aufgabe beendet ist.
Sie haben gesagt, dass Sie vor dem Bestätigen WaitAll (Aufgaben) aufgerufen haben. Ich wette, dass Ihre Fortsetzung ausgeführt worden wäre, wenn Sie genug Zeit gegeben hätten, aber die Ausnahme auf WaitAll () wird normalerweise auftreten, bevor Ihre Fortsetzung ausgeführt wird. Ihre Behauptungen sind wahrscheinlich gescheitert, bevor Ihre Fortsetzung eine Chance hatte, ihre Arbeit zu beenden.
Vielleicht, auf die Antwort von Henk Holterman, macht die Ordnung einen Unterschied. Das heißt,
%Vor%würde sicherstellen, dass HandleException bei Bedarf ausgeführt wird.
Ich benutze diesen Ansatz, weil er für einen netten, deklarativen, fließenden Programmierstil sorgt und den Code nicht mit Aspekten der Ausnahmebehandlung belastet.
%Vor%Tags und Links .net c# task-parallel-library .net-4.0 exception-handling