Ich weiß, dass es im Allgemeinen als schlechte Idee angesehen wird, Fire-and-Forget- async void
Methoden zum Starten von Aufgaben zu verwenden, da die anstehende Aufgabe nicht nachverfolgt werden kann und es schwierig ist, Ausnahmen zu behandeln, die in einer solchen Methode ausgelöst werden könnten.
Sollte ich async void
Event-Handler generell auch meiden ? Beispielsweise,
private async void Form_Load(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Ich kann es so umschreiben:
Task onFormLoadTask = null; // track the task, can implement cancellation
private void Form_Load(object sender, System.EventArgs e)
{
this.onFormLoadTask = OnFormLoadTaskAsync(sender, e);
}
private async Task OnFormLoadTaskAsync(object sender, System.EventArgs e)
{
await Task.Delay(2000); // do async work
// ...
}
Was sind die Unterwasserfelsen für asynchrone Event-Handler neben einem möglichen Wiedereintritt?
Antworten:
Die Richtlinie sollte vermieden werden,
async void
außer wenn sie in einem Ereignishandler verwendet wird. Daher ist die Verwendungasync void
in einem Ereignishandler in Ordnung.Aus Gründen des Unit-Tests möchte ich jedoch häufig die Logik aller
async void
Methoden herausrechnen. Z.B,quelle
Form_Load
den Zugriff auf ändernpublic
? Es scheint, als wäre der Code auf diese Weise weniger ausführlich.OnFormLoadAsync
. Ich sehe jetzt, dass dies ein praktischer Trick ist. Vielen Dank.Handled
Flag muss synchron gesetzt werden; Es ist nicht möglichasync
, eine Entscheidung darüber zu treffen, ob das Ereignis behandelt wird oder nicht.ICommand.Execute
Methodeasync void
; Ich halte dies für akzeptabel, daICommand.Execute
es sich logischerweise um einen Ereignishandler handelt.Im Allgemeinen sind Ereignishandler der einzige Fall, in dem eine nichtige asynchrone Methode kein potenzieller Codegeruch ist.
Wenn Sie die Aufgabe aus irgendeinem Grund verfolgen müssen, ist die von Ihnen beschriebene Technik durchaus sinnvoll.
quelle
Ja, im Allgemeinen ist die asynchrone Leere von Ereignishandlern der einzige Fall. Wenn Sie mehr darüber erfahren möchten, können Sie sich hier auf Kanal 9 ein großartiges Video ansehen
The only case where this kind of fire-and-forget is appropriate is in top-level event-handlers. Every other async method in your code should return "async Task".
Hier ist der Link
quelle
Wenn Sie ReSharper verwenden, kann eine kostenlose empfohlene Erweiterung hilfreich sein. Es analysiert die "async void" -Methoden und hebt sie hervor, wenn sie unsachgemäß verwendet werden. Die Erweiterung kann verschiedene Verwendungen von asynchroner Leere unterscheiden und geeignete Schnellkorrekturen bereitstellen, die hier beschrieben werden: ReCommended-Extension-Wiki .
quelle