我无法找到一个 C# 示例来演示如何在以下条件下引发跨线程事件:
假设我有 1 个事件和 3 个线程:
Event DoStuff
Thread A - WinForm
Thread B - Thread Spawned from Thread A to do some processing. Has Function Foo() which is subscribed to DoStuff
Thread C - Thread Spawned from Thread B to do some subprocessing and Raises event DoStuff
现在如何确保线程 C 中引发的事件在线程 B 而不是 C 或 A 内部处理。
我运行的所有示例都提示 Form/Control.Invloke 或类似的东西,我真的想让任何线程实际订阅的事件在其各自的线程内执行,而不仅仅是主窗体线程。
最佳答案
将一个调用编码到特定另一个线程是非常重要的。不可能任意中断线程并使其执行某些代码。这会导致可怕的重入问题。尝试使用信号量等手段来防止这种情况肯定会导致死锁。
目标线程必须配合,它必须处于“空闲”状态并且不会主动改变程序的状态。一个常见的机制是线程安全队列。事件引发线程将请求放入队列中,目标线程需要一个循环来从队列中读取请求并执行它们。也许这听起来很熟悉,是的,这就是程序的 UI 线程的工作方式。
关于c# - 当两个线程都不是 WinForm 时,在两个线程之间引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4853351/