나는 두 개의 IDisposables
을 순차적으로 배치해야합니다. 첫 번째 IDisposable
은 두 번째 IDisposable
에 의해 죽을 서비스에 의존하는 Rx 구독을 종료하므로 순서가 중요합니다. 이것은 IObservable
의 구독이 다른 스레드에서 발생해야하지만 UI 스레드에서 관찰 및 처리가 발생해야하는 Windows Forms 응용 프로그램 내에 있습니다. 대략 (한 번 감소) 다음 내가 가지고있는 코드에서 (. 사실, 나는 폐기만큼 순서가 보장 될 때 UI 스레드에서 발생하는 경우 상관 없어) 그래서 :여러 IDisposables의 순차적 처분 보장
SomeService = new DisposableService();
Subscription = Foo(someService).SubscribeOn(NewThreadScheduler.Default).ObserveOn(theForm).Subscribe(...)
을의 수에 UI 이벤트 이러한 두 가지를 순서대로 삭제해야합니다 (Subscription 및 SomeService). 나는 동일한 스레드에서 시리얼 폐기를 제공하기 위해 수신의 CompositeDisposable
ContextDisposable
에 추가를 사용하여 시도했다 이렇게하려면 다음을 수행
_Disposable = new CompositeDisposable(new[] {
new ContextDisposable(WindowsFormsSynchronizationContext.Current, Subscription),
new ContextDisposable(WindowsFormsSynchronizationContext.Current, SomeService)});
위는 그러나 작동하지 않습니다. 제 로깅 _Disposable
에 기초 SomeService
대한 ContextDisposable
동일한 스레드라고하지만 ContextDisposable
여전히 서비스에 배치되는 다른 스레드 concurent 발생하는 (따라서 경합 조건 NPEs 결과)이다.
나는 단지 주 동안의 C# 프로그래밍 봤는데 그래서 문제가 컨텍스트와 운영자가 어떻게 작동하는지 내 오해 확신합니다. 이 문제에 대한 올바른 접근법은 무엇입니까?
두 스레드를 동일한 스레드에서 처리 할 수없는 이유가 있습니까? dispose 메소드와 다른 모든 메소드를 동기화하는 경우 직접 순서를 제어 할 수 있습니다. 하나의 쓰레드에서 소비하고 다른 쓰레드로 처리해야한다면, 모든 소비자가 쓰레드 세이프 (threadafe safe)를하고, 처리하기 전에 그 쓰레드가 폐기되었는지를 확인해야한다. – devshorts