异步更新文本框

cou*_*011 2 .net c#

我正在创建一个电子邮件软件,向某些帐户发送电子邮件.我想在每次发送或发送新电子邮件时附加文本.但是文本框在发送所有电子邮件后显示我的报告.如果toList非常大,如30+个电子邮件,则应用程序屏幕变为白色,并且在发送所有电子邮件后,GUI将返回更新的OutPutTextBox.这是SendButton_Click方法中的代码

foreach (String to in toList)
{
    bool hasSent = SendMail(from, "password", to, SubjectTextBox.Text, BodyTextBox.Text);

    if (hasSent)
    {
        OutPutTextBox.appendText("Sent to: " + to);
    }
    else
    {
        OutPutTextBox.appendText("Failed to: " + to);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

你真正想做的是SendMail异步调用.在.NET 4.0中有几种方法可以做到这一点.我建议Taskforeach循环中启动一个对象,并为每个UI线程安排一个任务延续:

string subject = SubjectTextBox.Text;
string body = BodyTextBox.Text;
var ui = TaskScheduler.FromCurrentSynchronizationContext();
List<Task> mails = new List<Task>();
foreach (string to in toList)
{
  string target = to;
  var t = Task.Factory.StartNew(() => SendMail(from, "password", target, subject, body))
      .ContinueWith(task =>
      {
        if (task.Result)
        {
          OutPutTextBox.appendText("Sent to: " + to); 
        }
        else
        {
          OutPutTextBox.appendText("Failed to: " + to); 
        }
      }, ui);
  mails.Add(t);
}

Task.ContinueWhenAll(mails.ToArray(), _ => { /* do something */ });
Run Code Online (Sandbox Code Playgroud)

(语法可能稍微关闭;我没有编译它).