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?
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.
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:
Tags und Links c# exception-handling async-await asynchronous c#-5.0