c# - 异步更新文本框

标签 c# .net

我正在创建一个向某些帐户发送电子邮件的电子邮件软件。每次发送新电子邮件或失败时,我都想附加文本。但是文本框在发送完所有电子邮件后向我显示报告。如果 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);
    }
}

最佳答案

您真正想要做的是异步调用SendMail。在 .NET 4.0 中有几种方法可以做到这一点。我建议在 foreach 循环中启动一个 Task 对象,并为每个对象安排一个任务延续到 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 */ });

(语法可能略有偏差;我没有编译它)。

关于c# - 异步更新文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3281178/

相关文章:

c# - 如何在不调用函数的情况下检查C#中是否存在DLL入口点

c# - 反序列化 API 调用的 JSON 响应时出现问题。 .NET 6

c# - XAML 自定义文本框光标停留在输入开始处

c# - 应用程序不会死于未处理的异常?

c# - ToDictionary中的KeyValuePair解构

c# - 模仿 File.Move 如果目的地已经存在

C#代码到UML图

c# - 如何将这些代码更改为 C# 样式?

.net - 无法通过命令行构建混合解决方案(.NET Framework 与 .NET Standard)

.net - 如何在 F# 中声明可通过 WebJob 的 JobHost.CallAsync 调用的函数?