Heim >Backend-Entwicklung >C++ >Wie gehe ich mit Ausnahmen um, die von Async-Void-Methoden in C# ausgelöst werden?

Wie gehe ich mit Ausnahmen um, die von Async-Void-Methoden in C# ausgelöst werden?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-24 02:27:09695Durchsuche

How Do I Handle Exceptions Thrown by Async Void Methods in C#?

Ausnahmebehandlung von asynchronen Void-Methoden in C#

Bei der Verwendung des asynchronen CTP von .NET ist es wichtig zu verstehen, wie Ausnahmen innerhalb und außerhalb asynchroner Methoden behandelt werden, insbesondere beim Umgang mit asynchronen Void-Methoden.

Ausnahmeweitergabe in asynchronen Methoden

Im bereitgestellten C#-Code wird eine asynchrone Void-Methode namens Foo() asynchron ausgeführt und von der nicht-asynchronen Methode DoFoo() aufgerufen. Wenn in Foo() eine Ausnahme (z. B. ProtocolException) ausgelöst wird, wird diese nicht automatisch an DoFoo() weitergegeben. Dies liegt daran, dass asynchrone Void-Methoden kein Task-Objekt zurückgeben, auf das gewartet werden kann.

Behandeln Sie Ausnahmen in der aufrufenden Methode

Um eine Ausnahme abzufangen, die von einer asynchronen Void-Methode in der aufrufenden Methode ausgelöst wird, müssen Sie Folgendes tun:

  1. Warten auf Aufruf in einer asynchronen Methode:

    Ändern Sie die DoFoo()-Methode, um sie asynchron zu machen, und verwenden Sie „await Foo()“. Dadurch wird darauf gewartet, dass Foo() abgeschlossen ist, und alle Ausnahmen abgefangen, die möglicherweise ausgelöst werden.

  2. Synchronisierung wartet auf Abschluss:

    Verwenden Sie die Wait()-Methode von Foo(), um DoFoo() zu erhalten. Dadurch wird der Thread blockiert, bis der asynchrone Vorgang abgeschlossen ist, und jede auftretende Ausnahme wird ausgelöst.

Beispiel für die Verwendung von „await“:

<code class="language-csharp">public async void DoFoo()
{
    try
    {
        await Foo(); // 因为您已 await,所以会捕获异常
    }
    catch (ProtocolException ex)
    {
        // 处理异常
    }
}</code>

Beispiel für die Verwendung von Wait:

<code class="language-csharp">public void DoFoo()
{
    try
    {
        Foo().Wait(); // 因为您已等待,所以会捕获异常
    }
    catch (ProtocolException ex)
    {
        // 处理异常
    }
}</code>

Bedenken Sie, dass die Verwendung von Wait zu potenziellen Synchronisierungsproblemen führen kann, da der Thread blockiert wird, bis der Vorgang abgeschlossen ist. Es wird empfohlen, zuerst die Methode await zu verwenden, um das Blockieren von Threads zu vermeiden und die Reaktionsfähigkeit des Programms zu verbessern.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Ausnahmen um, die von Async-Void-Methoden in C# ausgelöst werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn