Heim >Backend-Entwicklung >C++ >Wann und warum ist „async void' eine schlechte Praxis in C#?

Wann und warum ist „async void' eine schlechte Praxis in C#?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 13:23:55657Durchsuche

When and Why Is `async void` a Bad Practice in C#?

Wann und warum gilt async void als schlechte Praxis?

Den Kontext verstehen:

Asynchrone Methoden in C# können zurückkehren entweder Aufgabe oder ungültig. Während asynchrone Void-Methoden in bestimmten Szenarien praktisch erscheinen können, bringen sie potenzielle Nachteile mit sich, weshalb von ihnen generell abgeraten wird. Lassen Sie uns untersuchen, warum asynchrones Leeren als schlechte Praxis gilt und wie man diese Situationen effektiver angeht.

Gründe, asynchrones Leeren zu vermeiden:

  1. Fehlerbehandlung Herausforderungen:
    Im Gegensatz zu asynchronen Task-Methoden sind Ausnahmen, die aus asynchronen Void-Methoden entkommen, unkonventionell Fehlerbehandlungssemantik, was es schwierig macht, sie angemessen zu behandeln.
  2. Herausforderungen beim Verfassen:
    Asynchrone Void-Methoden können nicht einfach in asynchrone Methoden höherer Ebene zusammengefasst werden. Dies schränkt die Wartbarkeit und Wiederverwendung des Codes ein.
  3. Testschwierigkeiten:
    Das Unit-Testen asynchroner Void-Methoden ist aufgrund der einzigartigen Fehlerbehandlung und Kompositionssemantik deutlich komplexer als das Testen asynchroner Task-Methoden .

Alternative Ansätze:

In dem bereitgestellten Beispiel, in dem der Fokus auf der Reaktion auf einen Schaltflächenklick liegt, ohne auf das Ergebnis zu warten, besteht ein geeigneterer Ansatz darin, die PrimeCustomTask-Methode als asynchrone Aufgabe zu definieren und die OnLoad-Methode als zu verwenden Ein Einstiegspunkt zum Starten des asynchronen Vorgangs. Auf diese Weise bleiben alle Vorteile asynchroner Task-Methoden erhalten:

protected override async void OnLoad(EventArgs e)
{
    if (CustomTask == null)
        await PrimeCustomTask();
}

private async Task PrimeCustomTask()
{
    CustomTask = new TaskCompletionSource<int>();
    while (CustomTask.Task.IsCompleted == false && IsDisposed == false) 
    {
        // Wait for button click to set the value
        await Task.Delay(100); 
    }

    int result = CustomTask.Task.Result;

    // Show the value
    if (result != 0) MessageBox.Show(result.ToString());
}

Durch die Einhaltung dieser Richtlinien können Sie die Fallstricke asynchroner Void-Methoden vermeiden und die Wartbarkeit, Wiederverwendbarkeit und Testbarkeit Ihres Codes verbessern.

Das obige ist der detaillierte Inhalt vonWann und warum ist „async void' eine schlechte Praxis in C#?. 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