如何在单击时实现while循环进行处理
本文关键字:循环 处理 while 实现 单击 | 更新日期: 2023-09-27 18:19:18
我希望你能帮我解决这个问题。当我点击电子邮件按钮时,在发送成功之前需要几秒钟的时间来处理。我需要把过程图像,但如何实现与"while"循环处理。
这里是代码:我认为我应该实现与client.Send(msg);进行处理。它是如何工作的?我将欣赏您的示例代码。谢谢!(我使用c#和WPF)
private void BtnSendEmailClick(object sender, RoutedEventArgs e)
{
SmtpClient client = null;
MailMessage msg = null;
try
{
msg = new MailMessage
{
From = new MailAddress("me@hotmail.com", "Me Hotmail")
};
msg.To.Add(txtEmailAddress.Text);
msg.Priority = MailPriority.High;
msg.Subject = "Blah blah";
msg.Body =
"<!DOCTYPE html><html lang='en' xmlns='http://www.w3.org/1999/xhtml'>" +
"<head> </head>" +
"<body>" +
"<h3>Message</h3>" +
"<p>" + lblEmailMessage.Content + "</p>" +
"</body>" +
"</html>";
msg.IsBodyHtml = true;
client = new SmtpClient
{
Host = "smtp.live.com",
Port = 25,
EnableSsl = true,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("me@hotmail.com", "password"),
DeliveryMethod = SmtpDeliveryMethod.Network
};
//how to implement while loop for processing
client.Send(msg);
lblMessage.Content = "Successfully sent to your Mail!";
}
catch (Exception ex)
{
lblMessage.Content = ex.Message;
}
}
您需要立即返回,并使用BackgroundWorker
发送电子邮件。完成后,可以使用Dispatcher
通知GUI。详见http://msdn.microsoft.com/en-us/magazine/cc163328.aspx
请参见如何使用WPF后台工作器
您想要显示一个图像来指示程序正在做某事(进度指示器)吗?
在这种情况下,您需要在单独的线程上完成发送电子邮件的工作。您可以通过几种方式做到这一点。最简单的(如果你使用的是。net 4)是使用await和async关键字。在开始工作之前,只需显示图像即可。您还需要将实际发送电子邮件的代码提取到一个新方法中。这样的:
private void BtnSendEmailClick(object sender, RoutedEventArgs e)
{
// Display progress image
progressImage.Visibility = System.Windows.Visibility.Visible;
string errorMessage = await SendEmail();
if (errorMessage == null)
{
lblMessage.Content = "Successfully sent to your Mail!";
}
else
{
lblMessage.Content = errorMessage;
}
progressImage.Visibility = System.Windows.Visibility.Hidden;
}
private async Task<string> SendEmail()
{
try
{
var msg = new MailMessage
{
From = new MailAddress("me@hotmail.com", "Me Hotmail")
};
msg.To.Add(txtEmailAddress.Text);
msg.Priority = MailPriority.High;
msg.Subject = "Blah blah";
msg.Body =
"<!DOCTYPE html><html lang='en' xmlns='http://www.w3.org/1999/xhtml'>" +
"<head> </head>" +
"<body>" +
"<h3>Message</h3>" +
"<p>" + lblEmailMessage.Content + "</p>" +
"</body>" +
"</html>";
msg.IsBodyHtml = true;
var client = new SmtpClient
{
Host = "smtp.live.com",
Port = 25,
EnableSsl = true,
UseDefaultCredentials = false,
Credentials = new NetworkCredential("me@hotmail.com", "password"),
DeliveryMethod = SmtpDeliveryMethod.Network
};
//how to implement while loop for processing
client.Send(msg);
return "Successfully sent to your Mail!";
}
catch (Exception ex)
{
return ex.Message;
}
}
最后一个注意事项:确保不要在你的'async'方法中触摸任何UI组件,因为不能保证代码将在UI线程上运行。如果您需要从异步方法返回更多信息,您必须创建一个自定义结构来包含结果并从SendEmail()方法返回。