如何解决如何让后台线程之间的事件在各自的上下文中执行
这个问题是 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 举报,一经查实,本站将立刻删除。