Wie sollte man auf eine asynchrone Aufgabe warten und ein modales Formular in derselben Methode zeigen?

8

Ich habe eine Windows-Formularanwendung, in der ich eine E-Mail mit SmtpClient sende. Andere Async-Operationen in der Anwendung verwenden async / await, und ich möchte im Idealfall konsistent sein, wenn ich die Mail sende.

Ich zeige einen modalen Dialog mit einer Abbrechen-Schaltfläche an, wenn ich die Mail sende, und kombiniere SendMailAsync mit form.ShowDialog ist, wo die Dinge schwierig werden, weil das Warten auf das Senden blockiert wird, und auch ShowDialog. Mein aktueller Ansatz ist wie folgt, aber es scheint chaotisch, gibt es einen besseren Ansatz dazu?

%Vor%     
FlintZA 13.04.2015, 11:45
quelle

2 Antworten

10

Ich würde in Erwägung ziehen, das Ereignis Form.Shown zu behandeln und zu senden die E-Mail von dort. Da es asynchron ausgelöst wird, müssen Sie sich nicht darum kümmern, die Blockierung von ShowDialog zu umgehen, und Sie haben eine etwas sauberere Methode zum Synchronisieren des Formulars und zum Anzeigen der Erfolgs- oder Fehlermeldung.

> %Vor%     
Todd Menier 13.04.2015, 15:39
quelle
1

Eine fragwürdige Sache an Ihrer bestehenden SendTestEmail Implementierung ist, dass sie tatsächlich synchron ist, obwohl sie Task zurückgibt. Es wird also nur zurückgegeben, wenn die Aufgabe bereits abgeschlossen ist, weil ShowDialog synchron ist (natürlich, weil der Dialog modal ist).

Dies kann etwas irreführend sein. Der folgende Code würde beispielsweise nicht wie erwartet funktionieren:

%Vor%

Es kann leicht mit Task.Yield adressiert werden, was es erlaubt, asynchron in der neuen (verschachtelten) modalen Dialog-Nachrichtenschleife fortzufahren:

%Vor%

Dann könntest du so etwas machen (ungetestet):

%Vor%     
Noseratio 13.04.2015 18:39
quelle

Tags und Links