微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何让后台线程之间的事件在各自的上下文中执行

如何解决如何让后台线程之间的事件在各自的上下文中执行

这个问题是 11 年前提出的,但答案都是假设 Winform/WPF。我想再问一次,但要澄清这是两个后台工作线程。

我想要两个线程。让我们打电话给他们:

  • 线程 A(Thread.CurrentThread.ManagedThreadId 为 16)
  • 线程 B(Thread.CurrentThread.ManagedThreadId 为 18);

线程 A 触发一个事件,线程 B 侦听此事件。当线程 B 事件侦听器(委托)被执行时,它会与线程 A 的上下文 (16) 一起执行。

我想做的是能够在线程 A (16) 中触发事件,并且委托代码在线程 B (18) 的上下文中执行。

据我所知,在这种情况下没有 SynchronizationContext 可用。

我该怎么做?

感谢您的帮助。

解决方法

您可以考虑使用 Microsoft 的 Reactive Framework(又名 Rx) - NuGet System.Reactive 并添加 using System.Reactive.Linq; - 这样您就可以利用 EventLoopScheduler 类。此类创建一个线程,您可以通过多种方式在其上安排任务。

鉴于 private EventLoopScheduler _eventLoopScheduler = new EventLoopScheduler(); 我可以这样做以在特定线程上运行代码:

IDisposable scheduled =
    _eventLoopScheduler
        .Schedule(() =>
        {
            /* Run code in the `EventLoopScheduler` */
        });

您甚至可以在未来安排活动并使其重复发生。要取消预定代码,您可以调用 scheduled.Dispose()

现在,给定 private event EventHandler MyEvent; 我可以用 Rx 库做到这一点:

IDisposable subscription =
    Observable
        .FromEventPattern<EventHandler,EventArgs>(
            h => this.MyEvent += h,h => this.MyEvent -= h)
        .ObserveOn(_eventLoopScheduler)
        .Subscribe(x =>
        {
            /* Run code in the `EventLoopScheduler` */
        });

这会订阅事件并将执行推送到由 EventLoopScheduler 创建的线程。

完成后调用 subscription.Dispose()_eventLoopScheduler.Dispose() 进行清理并允许线程结束。

,

像往常一样,当我找到一个优雅的问题解决方案时,我会看着它,想知道为什么它不会以这种方式从我的脑海中涌出?遗憾的是,我花了很长时间才到达那里,但我对结果以及如何轻松实现可重复使用感到满意。

我希望这是一个有用且有趣的读物:

https://codinglifestyle.wordpress.com/2021/04/15/thread-synchronization-between-worker-threads/

干杯, 克里斯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。