SmtpClient kullanarak e-posta gönderdiğim bir windows form uygulamasına sahibim. Uygulamadaki diğer async işlemleri async/wait'i kullanıyor ve postayı gönderirken tutarlı olmak isterim.Bir async görevini beklemeli ve aynı yöntemde bir modal formunu nasıl göstermeli?
Postayı gönderirken ve SendMailAsync'i form ile birleştirerek, bir iptal düğmesiyle kalıcı bir iletişim kutusu görüntüledim.Görüntüsü, işin zorlaştığı yerdir çünkü gönderenin beklemesi engellenir ve bu nedenle ShowDialog olur. Şu anki yaklaşımım şu şekildedir, ama dağınık görünüyor, buna daha iyi bir yaklaşım var mı?
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");
}
}
oldukça düzgün bir çözüm gibi görünüyor. 'Beklemenin' gerekli olmadığına, ancak güzel ve okunabilir olduğuna emin olursunuz. – Gusdor
Teşekkürler, eklediğiniz ve daha sonra kaldırdığınız çözümü denedim. Ancak form.Show (bu) (ana formun olduğu yer) artık ana formu ana form olarak kabul etmiyor, bu yüzden de yukarıdaki gibi bir açıklama yapmadığım form.StartPosition = FormStartPosition.CenterScreen davranışını kaybediyorum. Daha sonra üst formu geçerli form için üst ayarlamak için girişimi ve form üstte bir istisna atar.TopLevel salt okunur (tavşan delik! :)) – FlintZA
Ben yanlış oldu çünkü cevabı kaldırdı :) – Gusdor