Async-Ausnahmebehandlung mit void

8

Ich verwende Async-CTP, um eine IO-Konsolen-App zu schreiben. Aber ich habe Probleme mit Ausnahmen.

%Vor%

Und folgendes passiert: "done" wird in die Konsole geschrieben, dann bekomme ich die Ausnahme im Debugger, dann drücke ich weiter mein Programm existiert .
Was gibt?

    
TDaver 08.06.2011, 19:41
quelle

2 Antworten

9

Wenn Sie DoSomething() aufrufen, wird im Grunde ein Task unter der Haube erstellt und Task gestartet. Da Sie eine void -Signatur hatten, gibt es kein Task -Objekt, das zurückgesendet werden könnte oder auf das Sie geblockt hätten, also fiel die Ausführung direkt durch. Währenddessen löst die Aufgabe eine Ausnahme aus, die niemand abfängt, was vermutlich das Ende Ihres Programms bedeutet.

Ich denke, das Verhalten, das Sie wollten, ist eher so:

%Vor%

Dies wird für jeden DoSomething blockieren, bis es fertig ist, und die Schleife beenden, wenn DoSomething warf. Natürlich, dann machst du nichts Asynchrones. Aber aus dem Pseudocode kann ich nicht genau sagen, was Sie asynchron erreichen wollten.

Haupt-Take-Away: Wenn Sie void für eine asynchrone Methode verwenden, verlieren Sie die Möglichkeit, die Ausnahme zu erhalten, es sei denn, Sie verwenden diese asynchrone Methode await . Als ein Synchronisierungsanruf plant es im Grunde nur Arbeit und das Ergebnis verschwindet in den Äther.

    
Arne Claassen 08.06.2011, 20:00
quelle
11

Wenn Sie Ihrer Konsolenanwendung einen async-kompatiblen Kontext zuweisen (z. B. AsyncContext ( Dokumentation , < a href="https://github.com/StephenCleary/AsyncEx/blob/master/src/Nito.AsyncEx.Context/AsyncContext.cs"> Quelle ) aus meiner AsyncEx-Bibliothek), dann können Sie Ausnahmen abfangen die aus diesem Kontext heraus propagieren, sogar aus async void methods:

%Vor%     
Stephen Cleary 08.09.2011 15:25
quelle