如何在两个非UI线程中模拟Control.Invoke()

时间:2011-07-21 11:22:11

标签: .net multithreading events user-interface invoke

  1. 假设有一个线程A,它是一个UI线程。
  2. 线程A创建另一个线程B,它是一个非UI线程。
  3. 当线程B想要在线程A中引发事件时,它所要做的就是 if(Form1.InvokeRequired)Form1.Invoke(相同的方法)并在同一方法中调用事件对吗?
  4. 简单。但我的问题是,如果你想要做同样的事情,如果A和B都是非ui线程?没有形成对象来从线程B调用Invoke()。

    如果WinForms应用程序这样做,为什么没有像非UI线程那样的机制?我错过了什么吗?是否有类似的方法从另一个非ui线程在一个非ui线程中引发事件?

    提前致谢。

    P.S。生产者/消费者模型的答案不是我在这里寻找的。

2 个答案:

答案 0 :(得分:1)

在第一个场景中,由于线程B 知道它不是UI线程,所以也可以只调用.Invoke(...)

当有两个非UI线程时,您将不得不使用某种消息传递/队列。你不能只是中断线程A来运行工作;您必须将线程A编码为(例如)检查队列是否正常工作,使项目出列并执行它。这就是winforms所做的,由Windows消息循环提供。如果它不是您正在寻找的答案并不重要 - 它就是它。

答案 1 :(得分:1)

如果没有用户界面,则不存在交叉线程问题。所以只需从线程中调用它们即可。您可能需要一些同步机制。