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% 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.
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:
Dann könntest du so etwas machen (ungetestet):
%Vor%Tags und Links c# winforms async-await