1

我无法从主线程中的辅助线程调用事件。事件处理程序不在主线程上执行。谁能给我一些关于我做错了什么的指示。

谢谢

namespace ThreadSyncExample
{
  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("MainThread: " + System.Threading.Thread.CurrentThread.ManagedThreadId);

      Execute execThe = new Execute();
      execThe.FinishedThread += (src, arg) =>
      {
        //This shoould be executed on MainThread right?
        Console.WriteLine("Thread Id: " + System.Threading.Thread.CurrentThread.ManagedThreadId);
      };

      execThe.Run();
      Console.ReadKey();
    }

  }


  class Execute
  {
    public void Run()
    {
      Thread exec = new Thread(() =>
      {
        Console.WriteLine("Worker Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
        OnFinishedThread();
      });

      exec.Start();
    }

    public event EventHandler FinishedThread;
    protected virtual void OnFinishedThread()
    {
      if (null != FinishedThread)
      {
        EventArgs args = new EventArgs();
        FinishedThread(this, EventArgs.Empty);
      }
    }
  }
}
4

2 回答 2

2

C# 事件基本上只是一个易于使用的委托集合,“触发”一个事件只会导致运行时循环遍历所有委托并一次触发一个。

因此,您的 OnFinishedThread 事件处理程序将在 Worker 线程上被调用。

如果你想让你的事件在主线程上,你必须这样Invoke()做。

编辑 :

您似乎无权访问表单或 WPF(因此您无权访问Invoke()任何一个)

因此,您必须通过线程同步过程手动编组对主线程的调用。一般是痛。

可能最简单的解决方案是简单地使用BackgroundWorker,因为这样您不再需要手动编组对主线程的调用。

var worker = new BackgroundWorker();
worker.DoWork += (sender, e) =>
{
    // call the XYZ function
    e.Result = XYZ();
};
worker.RunWorkerCompleted += (sender, e) =>
{
    // use the result of the XYZ function:
    var result = e.Result;
    // Here you can safely manipulate the GUI controls
};
worker.RunWorkerAsync();
于 2012-10-03T13:18:25.857 回答
1

FinishedThread() 事件处理程序将在执行 Execute.Run() 的同一线程上执行。仅仅因为您在 main() 中定义了 FinishedThread 事件处理程序的主体,并不意味着 main() 以某种方式定义了它的执行上下文。

您可以使用一些机制来执行线程编组:

  1. 使用 system.windows.forms.control 并使用 Invoke 方法将函数调用编组回创建控件的线程。在后台,这将使用 Windows 消息循环的功能来处理实际的 marshal
  2. 使用同步原语手动处理编组。

与其重复已经说明的内容,不如查看此答案以获取有关编组的更多信息:

手动编组到线程

于 2012-10-03T13:19:06.153 回答