Try-Catch Async-Ausnahmen

8

Dieses Beispiel schlägt fehl:

%Vor%

Das heißt, die Ausnahme mit dem Text "Fehler" platzt auf.

Dann habe ich diese Problemumgehung versucht:

%Vor%

Das hat auch nicht geholfen.

Ich nehme an, dass meine Async CTP Refresh-Installation abgesprengt werden könnte.

Sollte dieser Code so funktionieren, wie ich es erwarte ("Erfolg" sprudelt, nicht "Scheitern"), oder soll das nicht so funktionieren? Und wenn nicht, wie würdest du es umgehen?

    
Bent Rasmussen 16.06.2011, 19:02
quelle

1 Antwort

5

Das Verhalten, das Sie sehen, ist wahrscheinlich ein Randfallfehler oder ist möglicherweise sogar korrekt, wenn es nicht intuitiv ist. Wenn Sie eine asynchrone Methode synchron aufrufen, wird normalerweise eine Task zur Ausführung umgeleitet, und da niemand wartet, bis die Task beendet ist, wird die Exception nie zum Hauptthread weitergeleitet. Wenn Sie Main direkt aufrufen würden, würde es gelingen, aber dann würde Ihre Laufzeit eine Ausnahme von "Erfolg" in einem anderen Thread sehen.

Da main der Einstiegspunkt Ihrer Anwendung ist, wird es synchron aufgerufen und wahrscheinlich, da der Einstiegspunkt das Task-Wrapping-Verhalten nicht auslöst, so dass hawn nicht richtig ausgeführt wird und TaskEx.Run einen eigenen Thread auslöst, der wird in der Laufzeit angezeigt, da eine Ausnahme in einem anderen Thread ausgelöst wird.

Wenn Sie main als async -Methode ausführen würden, dh Task zurückgeben (da ein async , das void zurückgibt, nur über await aufgerufen werden kann) und es von Ihrem synchronen Block aus blockiert Im Hauptkontext erhalten Sie das entsprechende Verhalten, wie der folgende Test zeigt:

%Vor%

i.e. Die Aufgabe weist einen Fehler in AggregateException auf, der die Ausnahme Erfolg als innere Ausnahme enthält.

    
Arne Claassen 16.06.2011, 19:40
quelle

Tags und Links