我无法找到一个c#示例,该示例演示如何在以下条件中引发跨线程事件:
假设我有1个事件和3个线程:
事件DoStuff
主题A - WinForm
线程B - 从线程A产生的线程进行一些处理。有函数Foo()订阅了DoStuff
线程C - 从线程B产生的线程进行一些子处理并引发事件DoStuff
现在我如何确保线程C中引发的事件在线程B内而不是C或A中处理。
我运行的所有样本都提示着Form / Control.Invloke,或者那种类型的东西,我真的想让任何线程实际订阅的事件在它的repsective线程中执行,而不仅仅是主窗体线。
答案 0 :(得分:4)
将一个线程的调用编组到特定的其他线程是非常不重要的。不可能任意中断线程并使其执行某些代码。这导致了可怕的重新入侵问题。试图用信号量来保护信号不会导致死锁。
目标线程必须合作,它必须是“空闲”而不是主动改变程序的状态。一种常见的机制是线程安全队列。事件提升线程在队列上发出请求,目标线程需要一个循环来读取队列中的请求并执行它们。也许这听起来很熟悉,是的,这就是程序的UI线程的工作方式。