我有两个IDisposables
,我需要按顺序处置。订购是重要的,因为第一个IDisposable
杀死了一个Rx订阅,该订阅依赖于将被第二个IDisposable
杀死的服务。这是在一个Windows窗体应用程序中,IObservable
的订阅需要在不同的线程上发生,但观察和处理需要在UI线程上发生。 (其实,我不,如果所述设置UI线程上发生的,只要顺序确保在意。)所以,在代码中,我大致有以下的(一次降低):确保顺序处置多个IDisposables
SomeService = new DisposableService();
Subscription = Foo(someService).SubscribeOn(NewThreadScheduler.Default).ObserveOn(theForm).Subscribe(...)
在一些UI事件我需要按顺序处理这两个(订阅,然后SomeService)。要做到这一点我一直在使用的Rx的CompositeDisposable
除了ContextDisposable
提供相同的线程上串行配置之尝试:
_Disposable = new CompositeDisposable(new[] {
new ContextDisposable(WindowsFormsSynchronizationContext.Current, Subscription),
new ContextDisposable(WindowsFormsSynchronizationContext.Current, SomeService)});
以上不工作,但是。根据我的日志记录_Disposable
和ContextDisposable
为SomeService
在同一个线程上调用,但ContextDisposable
仍然发生在与服务正在处理(从而导致竞争条件和NPE)的不同线程上。
我只是编程了几个星期的C#,所以我确信问题在于我对上下文和调度程序的工作方式的误解。这个问题的正确方法是什么?
是否有一个原因,你不能只在同一个线程中处置两个?如果同步dispose方法和所有其他方法,则可以自己控制顺序。如果你必须从一个线程中使用并在另一个线程中处理,那么你需要让所有的使用者线程安全,并在你做任何事情之前检查它是否已被处置。 – devshorts