Ho un'applicazione Windows Form in cui invio un'email tramite SmtpClient. Altre operazioni asincrone nell'applicazione utilizzano async/await, e mi piacerebbe essere coerenti in questo quando invio la posta.Come si deve gestire l'attesa di un'attività asincrona e mostrare una forma modale nello stesso metodo?
Visualizzo una finestra di dialogo modale con un pulsante di annullamento quando si invia la posta e combina SendMailAsync con form.ShowDialog è dove le cose si complicano perché attendere l'invio si bloccherebbe, e quindi ShowDialog. Il mio attuale approccio è il seguente, ma sembra disordinato, c'è un approccio migliore a questo?
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");
}
}
La sembra una soluzione veramente pulito. Hai ragione nel dire che l'attesa non è richiesta ma è piacevole e leggibile. – Gusdor
Grazie, ho provato la soluzione che hai aggiunto e poi rimosso. Ma form.Show (this) (dove questo è il modulo principale) non considera più il modulo principale come genitore, quindi perdo il comportamento da form.StartPosition = FormStartPosition.CenterScreen che non ho incluso sopra. Tentativo di impostare il genitore sul modulo corrente genera un'eccezione sul modulo di livello superiore e form.TopLevel è di sola lettura (buca del coniglio! :)) – FlintZA
Ho rimosso la risposta perché non ero corretto :) – Gusdor