Fli*_*tZA 8 c# winforms async-await
我有一个Windows窗体应用程序,我在其中使用SmtpClient发送电子邮件.应用程序中的其他异步操作使用async/await,理想情况下,我希望在发送邮件时保持一致.
我在发送邮件时显示一个带取消按钮的模态对话框,并将SendMailAsync与form.ShowDialog组合在一起,因为等待发送会阻塞,所以ShowDialog也是如此.我目前的做法如下,但看起来很乱,有没有更好的方法呢?
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");
}
}
Run Code Online (Sandbox Code Playgroud)
Tod*_*ier 10
我会考虑处理Form.Shown事件并从那里发送电子邮件.由于它将以异步方式触发,因此您无需担心"解决" ShowDialog阻塞性质,并且您可以采用稍微更清晰的方式来同步关闭表单并显示成功或失败消息.
form.Shown += async (s, a) =>
{
try
{
await client.SendMailAsync(message);
form.Close();
MessageBox.Show("Test mail sent", "Success");
}
catch(Exception ex)
{
form.Close();
string text = string.Format(
"Error sending test mail:\n{0}",
ex.Message);
MessageBox.Show(text, "Error");
}
};
form.ShowDialog();
Run Code Online (Sandbox Code Playgroud)