Tôi có một ứng dụng biểu mẫu cửa sổ, trong đó tôi gửi email bằng SmtpClient. Các hoạt động không đồng bộ khác trong ứng dụng sử dụng async/await và tôi lý tưởng muốn nhất quán trong khi gửi thư.Làm thế nào nên chờ đợi một nhiệm vụ không đồng bộ và hiển thị một hình thức phương thức trong cùng một phương pháp được xử lý?
Tôi hiển thị hộp thoại phương thức có nút hủy khi gửi thư và kết hợp SendMailAsync với biểu mẫu.ShowDialog là nơi mọi thứ trở nên phức tạp bởi vì việc chờ gửi sẽ chặn và ShowDialog sẽ như vậy. Cách tiếp cận hiện tại của tôi là như dưới đây, nhưng có vẻ lộn xộn, có cách tiếp cận tốt hơn cho điều này không?
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");
}
}
này dường như là một giải pháp thực sự gọn gàng. Bạn chính xác rằng 'await' là không cần thiết nhưng nó là tốt đẹp và dễ đọc. – Gusdor
Cảm ơn, tôi đã thử giải pháp bạn đã thêm vào rồi xóa. Nhưng form.Show (điều này) (nơi đây là hình thức chính) không còn xử lý các hình thức chính như cha mẹ vì vậy tôi bị mất hành vi từ form.StartPosition = FormStartPosition.CenterScreen mà tôi đã không bao gồm ở trên. Cố gắng để sau đó thiết lập các phụ huynh để các hình thức hiện tại ném một ngoại lệ về hình thức được cấp cao nhất, và form.TopLevel là chỉ đọc (thỏ lỗ! :)) – FlintZA
Tôi loại bỏ câu trả lời vì tôi đã sai :) – Gusdor