从后台线程结果更新Winforms UI

Ser*_*gey 4 .net multithreading winforms

这可能是一个愚蠢的问题,但我找不到stackoverflow的答案.

我在Winform应用程序中有一个按钮单击事件,该应用程序运行一个线程来计算结果以显示在表单中.

当线程计算结果时,如何更新Forms UI?

    private void btnRequestR2Approval_Click(object sender, EventArgs e)
    {
        if (User.IsLogged)
        {
            ValidationResults results = new ValidationResults();
            results.Show();

            Logger log = Logger.Instance();
            Logger.NewLogAddedHandler messageDelegate = new Logger.NewLogAddedHandler(results.NewLogMessage);

            if (!log.IsEventHandlerRegistered())
            {
                log.NewLogAdded += messageDelegate;
            }

            ThreadStart operation = new ThreadStart(ValidateAndSubmit);
            Thread theThread = new Thread(operation);
            theThread.Start();

        }
        else
        {
            MessageBox.Show("Please login");
        }

    }
Run Code Online (Sandbox Code Playgroud)

谢谢

Don*_*kby 13

在WinForms中执行后台任务的最简单方法是使用BackgroundWorker.

  • 把它放到表格上.
  • 结束活动.至少,使用DoWork.你可能也想要RunWorkerCompleted.
  • DoWork活动中写下你的后台任务.
  • RunWorkerCompleted事件中写下任何UI更改.
  • 调用backgroundWorker1.RunWorkerAsync();启动过程,可能来自某个按钮处理程序.

使用BackgroundWorker避免了所有烦人的线程处理和IsInvokeRequired的东西.

这是一篇更详细的how-to文章.