gpt4 book ai didi

c# - 应该如何处理等待异步任务并在同一方法中显示模态表单?

转载 作者:太空狗 更新时间:2023-10-29 18:24:43 27 4
gpt4 key购买 nike

我有一个 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");
}
}

最佳答案

我会考虑处理 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();

关于c# - 应该如何处理等待异步任务并在同一方法中显示模态表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604505/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com