【问题标题】:Raising an Event between 2 threads when neither thread is a WinForm当两个线程都不是 WinForm 时在 2 个线程之间引发事件
【发布时间】:2011-01-31 16:30:39
【问题描述】:

我无法找到一个展示如何在以下情况下引发跨线程事件的 c# 示例:

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

事件处理

线程 A - WinForm

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

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

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

我运行的所有示例都指向 Form/Control.Invloke 或类似的东西,我真的希望让实际订阅事件的任何线程在其对应线程内执行,而不仅仅是主窗体线程。

【问题讨论】:

  • 为什么要使用事件而不是仅仅加入或使用工作线程池?
  • 线程不处理事件,方法处理。也许解释一下你需要这个做什么,有人可以想出一个替代方案。
  • 我正在构建一个类,该类可能会或可能不会在产生线程的 WinForm(可能是控制台应用程序)中使用。在那个线程中,我想引发一个似乎来自实例化类的线程的事件。我只是对这个问题采取了一种更通用的方法,看看事件的订阅是否知道订阅来自哪个线程,以及是否有某种方式我不知道在原始线程中执行订阅的委托。在汉斯的回应之后,为什么没有消息泵线程这是不合理的,这是完全有道理的。

标签: c# multithreading events delegates


【解决方案1】:

将一个线程的调用编组到特定另一个线程是非常不平凡的。不能任意中断线程,让它执行一些代码。这会导致可怕的重入问题。尝试使用信号量来防止这种情况肯定会导致死锁。

目标线程必须配合,它必须是'idle'并且不主动改变程序的状态。一个常见的机制是线程安全队列。事件引发线程将请求放入队列,目标线程需要一个循环来从队列中读取请求并执行它们。也许这听起来很熟悉,是的,这就是程序的 UI 线程的工作方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多