Ich habe eine Windows Forms-Anwendung, in der ich eine E-Mail mit SmtpClient senden. Andere Async-Operationen in der Anwendung verwenden async/await, und ich möchte beim Senden der E-Mail idealerweise konsistent sein.Wie sollte das Warten auf eine asynchrone Aufgabe und das Anzeigen einer modalen Form in der gleichen Methode behandelt werden?
Ich zeige einen modalen Dialog mit einer Abbrechen-Schaltfläche beim Senden der E-Mail und Kombination SendMailAsync mit form.ShowDialog ist, wo die Dinge schwierig werden, da der Send warten würde, und ShowDialog würde. Mein aktueller Ansatz ist wie folgt, aber es scheint chaotisch, gibt es einen besseren Ansatz dazu?
private async Task SendTestEmail()
{
// Prepare message, client, and form with cancel button
using (Message message = ...)
{
SmtpClient client = ...
CancelSendForm form = ...
// Have the form button cancel async sends and
// the client completion close the form
form.CancelBtn.Click += (s, a) =>
{
client.SendAsyncCancel();
};
client.SendCompleted += (o, e) =>
{
form.Close();
};
// Try to send the mail
try
{
Task task = client.SendMailAsync(message);
form.ShowDialog();
await task; // Probably redundant
MessageBox.Show("Test mail sent", "Success");
}
catch (Exception ex)
{
string text = string.Format(
"Error sending test mail:\n{0}",
ex.Message);
MessageBox.Show(text, "Error");
}
}
Das scheint wie eine wirklich saubere Lösung. Sie haben Recht, dass das 'erwarten' nicht erforderlich ist, aber es ist schön und lesbar. – Gusdor
Danke, ich habe versucht, die Lösung, die Sie hinzugefügt und dann entfernt. Aber form.Show (this) (wo dies das Hauptformular ist) behandelt das Hauptformular nicht mehr als Eltern, daher verliere ich das Verhalten von form.StartPosition = FormStartPosition.CenterScreen, das ich oben nicht erwähnt habe. Wenn versucht wird, das übergeordnete Element auf das aktuelle Formular zu setzen, wird eine Ausnahme ausgelöst, da Formular oberste Ebene ist und form.TopLevel nur gelesen wird (Kaninchenloch! :)) – FlintZA
Ich entfernte die Antwort, weil ich falsch war :) – Gusdor