当两个线程都不是WinForm时,在两个线程之间引发事件

时间:2011-01-31 16:30:39

标签: c# multithreading events delegates

我无法找到一个c#示例,该示例演示如何在以下条件中引发跨线程事件:

假设我有1个事件和3个线程:

  

事件DoStuff

     

主题A - WinForm

     

线程B - 从线程A产生的线程进行一些处理。有函数Foo()订阅了DoStuff

     

线程C - 从线程B产生的线程进行一些子处理并引发事件DoStuff

现在我如何确保线程C中引发的事件在线程B内而不是C或A中处理。

我运行的所有样本都提示着Form / Control.Invloke,或者那种类型的东西,我真的想让任何线程实际订阅的事件在它的repsective线程中执行,而不仅仅是主窗体线。

1 个答案:

答案 0 :(得分:4)

将一个线程的调用编组到特定的其他线程是非常不重要的。不可能任意中断线程并使其执行某些代码。这导致了可怕的重新入侵问题。试图用信号量来保护信号不会导致死锁。

目标线程必须合作,它必须是“空闲”而不是主动改变程序的状态。一种常见的机制是线程安全队列。事件提升线程在队列上发出请求,目标线程需要一个循环来读取队列中的请求并执行它们。也许这听起来很熟悉,是的,这就是程序的UI线程的工作方式。