【问题标题】:C#: Sending email to a list of recipients in a loop and update UIC#:循环发送电子邮件到收件人列表并更新 UI
【发布时间】:2016-04-20 08:19:37
【问题描述】:

我创建了一个 Windows From 应用程序 (.Net 4.5) 并使用循环向不同的收件人发送电子邮件(一个包含电子邮件地址和复选框的列表视图);

for (int i = 0; i < ListView_addresses.Items.Count; i++)
{
    try
    {
        ListView_addresses.Items[i].Selected = true;
        ///////////////////////////////
        //the code for smtp properties
        //////////////////////////////
        SmtpServer.Send(mail);
        ListView_addresses.Items[i].Checked = true;
    }
    catch
    {
        ListView_addresses.Items[i].Checked = false;
    }
}

如果可以发送电子邮件,则勾选复选框,如果不能发送。

问题是主UI在执行过程中被阻塞,没有刷新列表视图中的更改。

我该怎么办?

【问题讨论】:

  • 您可以使用 TPL、线程或后台工作程序。我更喜欢Backgroundworker。您必须在主线程中可视化进度。
  • 我该怎么做?我的意思是实现代码

标签: c# multithreading email user-interface


【解决方案1】:

您必须在单独的线程中执行邮件功能,以免阻塞 ui 线程,或者您可以使用异步功能。 一种解决方案是使用后台工作人员。检查这个https://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx

【讨论】:

    【解决方案2】:

    使用“异步 - 等待”概念来完成这项工作。当进程发送电子邮件时,UI 仍会响应。 欲了解更多信息,请参阅链接: https://msdn.microsoft.com/en-us/library/hh191443.aspx

    【讨论】:

      【解决方案3】:

      这是我的背景工作者示例:

      public partial class Form1 : Form
      {
          public Form1()
          {
              InitializeComponent();
      
              BackgroundWorker bw = new BackgroundWorker();
              bw.WorkerReportsProgress = true;
              bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
              bw.DoWork += new DoWorkEventHandler(bw_DoWork);
              bw.RunWorkerAsync();
          }
      
          void bw_DoWork(object sender, DoWorkEventArgs e)
          {
              for (int i = 0; i < ListView_addresses.Items.Count; i++)
              {
                  try
                  {
      
                      //ListView_addresses.Items[i].Selected = true;
                      ///////////////////////////////
                      //the code for smtp properties
                      //////////////////////////////
                      SmtpServer.Send(mail);
                      //ListView_addresses.Items[i].Checked = true;
                      ((BackgroundWorker)sender).ReportProgress(0, new SmtpResult { Index = i, Checked = true, Selected = true });
                  }
                  catch
                  {
                      ListView_addresses.Items[i].Checked = false;
                      ((BackgroundWorker)sender).ReportProgress(0, new SmtpResult { Index = i, Checked = false, Selected = true });
                  }
              }
          }
      
          void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
          {
              var result = (SmtpResult)e.UserState;
              ListView_addresses.Items[result.Index].Checked = result.Checked;
              ListView_addresses.Items[result.Index].Selected = result.Selected;
          }
      }
      
      public class SmtpResult
      {
          public int Index { get; set; }
          public bool Checked { get; set; }
          public bool Selected { get; set; }
      }
      

      【讨论】:

        【解决方案4】:

        SmtpServer.Send(mail); 不会在电子邮件失败或送达时返回任何内容,因为 SMTP 是一种无状态协议。因此,您需要在一段时间后检查电子邮件的状态,例如,在您发送电子邮件的 POP3 帐户中的 6 小时后。

        【讨论】:

          猜你喜欢
          • 2018-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-25
          • 1970-01-01
          • 2021-07-19
          相关资源
          最近更新 更多