如何在单击时实现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;
        }
    }

如何在单击时实现while循环进行处理

您需要立即返回,并使用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()方法返回。