Ausnahmebehandlung asynchroner void
Methoden
Bei der Verwendung von Microsofts Async CTP für die asynchrone Programmierung ist es wichtig, das Ausnahmebehandlungsverhalten asynchroner void
Methoden zu verstehen. Stellen Sie sich das folgende Szenario vor:
<code class="language-csharp">public async void Foo() { var x = await DoSomethingAsync(); } public void DoFoo() { try { Foo(); } catch (ProtocolException ex) { // 异常将永远不会被捕获。 } }</code>
Die Frage ist: Kann die in der asynchronen Methode DoFoo
ausgelöste Ausnahme in der aufrufenden Methode Foo
abgefangen werden?
Antwort: Ja (aber es gibt Voraussetzungen)
Ausnahmen sprudeln bis zum Anrufcode, aber nur, wenn Sie einen Anruf an await
oder Wait()
Foo
benötigen. Ändern Sie den Code wie folgt:
<code class="language-csharp">public async Task Foo() { var x = await DoSomethingAsync(); } public async void DoFoo() { try { await Foo(); } catch (ProtocolException ex) { // 异常将被捕获,因为它是一个异步方法。 } } public void DoFoo() { try { Foo().Wait(); } catch (ProtocolException ex) { // 异常将被捕获,因为调用被等待。 } }</code>
Dies ermöglicht die Ausnahmebehandlung im aufrufenden Code.
Es ist jedoch wichtig zu beachten, dass Stephen Cleary, eine Autorität auf dem Gebiet der asynchronen Programmierung, warnt:
Darüber hinaus kann die Verwendung von„Asynchrone
void
-Methoden haben unterschiedliche Fehlerbehandlungssemantiken. Wenn eine Ausnahme von einer asynchronenTask
- oder asynchronenTask<T>
-Methode ausgelöst wird, wird die Ausnahme abgefangen und auf demTask
-Objekt platziert. Richtig Für asynchronevoid
-Methoden gibt es keinTask
-Objekt, sodass jede von einer asynchronenvoid
-Methode ausgelöste Ausnahme direkt auf demvoid
ausgelöst wird, das aktiv war, als die asynchroneSynchronizationContext
-Methode initiiert wurde.
zum Warten auf den Abschluss einer Aufgabe die Anwendung blockieren, wenn .NET beschließt, die Methode synchron auszuführen. Wait()
Das obige ist der detaillierte Inhalt vonKönnen in asynchronen Void-Methoden ausgelöste Ausnahmen durch aufrufende Methoden abgefangen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!