处理订阅线程上的事件- c#

本文关键字:事件 线程 处理 | 更新日期: 2023-09-27 17:48:56

我一直在对多线程c#事件处理做一些简短的研究,因为我怀疑事件处理程序只会在调用事件的任何线程上被调用,结果证明是正确的。

现在我觉得这是一个非常糟糕的主意,因为订阅对象上的事件的代码可能根本不是设计为多线程的,并且该对象的实现(应该是一个黑盒,不是吗?),如果在后台多线程(就像我的情况一样)可能导致订阅者代码在多个线程中执行,从而导致各种奇怪的问题。

所以我的问题是,是否有可能将事件推回最初订阅它的线程,从而避免订阅者级别的任何意外并发?或者更抽象地说,我可以在某个时间点记录当前线程,并在稍后的时间点将事件处理程序调用(或任何任意代码段)推送到该线程上吗?

关键是:我在一个不引用WinForms或WPF的DLL中这样做。我知道这些框架中存在允许这样做的结构(我自己也使用过),但我想在不引用这些库的情况下做到这一点。

小背景:

我的设计使用后台线程在一个对象上做工作,这可能导致其属性被改变。我使用INotifyPropertyChanged向观察者发出这些属性变化的信号。我使用库外的WPF在接口中显示这些对象,因此INotifyPropertyChanged很有用,因为它告诉WPF在正在显示的对象上的属性发生变化时更新屏幕。

我假设WPF内部处理多线程更改通知,所以如果我只坚持使用WPF,可能不会有问题。但是,我希望任何人都能够订阅更改事件,而不必担心它们在后台线程中被调用。

处理订阅线程上的事件- c#

您可以使用SynchronizationContext类在UI线程上运行代码,而无需引用WinForms或WPF。

在添加处理程序时捕获SyncronizationContext.Current,然后使用捕获的实例调用每个处理程序