给定 C#代码示例:

using System;
using System.Threading;
using System.Windows.Forms;

public class MnFrm : Form
{
   private void MnFrm_Load(Object sender, EventArgs e)
   {
      this.WorkCompleted += MnFrm_WorkCompleted;
   }

   private void btn_Click(Object sender, EventArgs e)
   {
      ThreadPool.QueueUserWorkItem(AsyncMethod);
   }

   private void MnFrm_WorkCompleted(Object sender, Boolean e)
   {
      MessageBox.Show("Work completed");
   }

   private void AsyncMethod(Object state)
   {
      // Do stuff
      Boolean result = true; // just as an example
      WorkCompleted?.Invoke(this, result);
   }

   private event EventHandler<Boolean> WorkCompleted;
}

当用户单击btn按钮时,在由ThreadPool管理的另一个线程上执行AsyncMethod方法。一段时间后,工作完成,结果通过另一个事件回发。
此事件处理程序(WorkCompleted)在用于运行AsyncMethod的线程上执行,因为在执行应用程序时,您会遇到“Cross-Threading”异常。

因此,问题是如何在UI线程上运行事件处理程序MnFrm_WorkCompleted

最佳答案

您可以使用Control.Invoke或Control.BeginInvoke方法来调用UI线程上的特定方法。
试试下面的代码:

private void MnFrm_WorkCompleted(Object sender, Boolean e)
{
    if (InvokeRequired)
    {
       Invoke((Action) (() => MnFrm_WorkCompleted(sender, e)));
       return;
    }
    MessageBox.Show("Work completed");
}

对于Invoke和BeginInvoke之间的区别:
What's the difference between Invoke() and BeginInvoke()

10-06 15:44