我有两个IDisposables
需要按顺序处理。排序很重要,因为第一个IDisposable
会杀死依赖于将被第二个杀死的服务的 Rx 订阅IDisposable
。这是在 Windows 窗体应用程序中,订阅IObservable
需要发生在不同的线程上,但观察和处置需要发生在 UI 线程上。(实际上,只要确保顺序,我不在乎是否在 UI 线程上进行处理。)因此,在代码中,我大致有以下内容(一旦减少):
SomeService = new DisposableService();
Subscription = Foo(someService).SubscribeOn(NewThreadScheduler.Default).ObserveOn(theForm).Subscribe(...)
在许多 UI 事件中,我需要按顺序处理这两个事件(订阅和 SomeService)。为此CompositeDisposable
,除了ContextDisposable
在同一线程上提供串行处理之外,我还尝试使用 Rx:
_Disposable = new CompositeDisposable(new[] {
new ContextDisposable(WindowsFormsSynchronizationContext.Current, Subscription),
new ContextDisposable(WindowsFormsSynchronizationContext.Current, SomeService)});
但是,上述方法不起作用。根据我的日志记录_Disposable
,ContextDisposable
forSomeService
在同一个线程上调用,但ContextDisposable
仍然发生在与正在处理的服务并发的不同线程上(从而导致竞争条件和 NPE)。
我只用了几个星期的 C# 编程,所以我确信问题在于我对上下文和调度程序如何工作的误解。解决这个问题的正确方法是什么?