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

标签 c# multithreading events delegates

我无法找到一个 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/

相关文章:

c# - DateTimeOffset.TryParseExact 的 AM/PM 有问题

python - BoundedSemaphore 在 KeyboardInterrupt 上挂起在线程中

javascript - 为什么来自 jQuery 绑定(bind)的事件对象与 addEventListener 不同

c# - WPF - 声明自定义路由事件并监听它

events - 如何正确创建 Google Analytics(分析)事件标签的目标?

c# - 多页 PrintDocument 中的不同方向(如何)

c# - 用于对多个超大型数据数组进行分组操作的 SIMD 矢量化策略

C# dynamic关键字的实用用法

java - 通知调用方法线程中发生的异常

multithreading - Powershell:Receive-Job中出现意外结果