0

我希望你能帮助我解决这个问题。当我单击电子邮件按钮时,需要几秒钟才能成功发送。我需要放置过程图像,但是如何使用“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;

        }

    }
4

2 回答 2

1

您需要立即返回,并使用 aBackgroundWorker发送电子邮件。完成后,您可以使用Dispatcher通知 GUI。有关详细信息,请参阅http://msdn.microsoft.com/en-us/magazine/cc163328.aspx 。

另请参阅如何使用 WPF 后台工作人员

于 2013-06-20T16:02:05.653 回答
0

您是否要显示图像以指示程序正在执行某些操作(进度指示器)?

在这种情况下,您需要在单独的线程上完成发送电子邮件的工作。您可以通过多种方式做到这一点。最简单的(如果您使用的是 .NET 4)是使用awaitasync关键字。只需在开始工作之前显示图像。您还需要将实际发送电子邮件的代码提取到新方法中。像这样:

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;
    }
}

最后一点:确保不要在“异步”方法中触摸任何 UI 组件,因为无法保证代码将在 UI 线程上运行。如果您需要从异步方法返回的更多信息,则必须创建一个自定义结构来包含结果并从该 SendEmail() 方法返回它。

于 2013-06-20T16:08:30.717 回答