Program Club

SubscribeOn과 ObserveOn의 차이점은 무엇입니까?

proclub 2020. 11. 1. 19:01
반응형

SubscribeOn과 ObserveOn의 차이점은 무엇입니까?


나는 방금 발견했다 SubscribeOn. 이것은 내가 대신에 그것을 사용해야할지 궁금하게 만든다 ObserveOn. 구글은 저를 여기여기로 데려 갔지만 어느 쪽도 차이를 이해하는 데 도움이되지 않았습니다. 믿을 수 없을 정도로 미묘 해 보입니다.

(제 컨텍스트에서는 GUI가 아닌 스레드에서 이벤트가 '예정'되고 이벤트 데이터를 사용하여 컨트롤을 업데이트하기 전에 GUI 스레드로 전환해야합니다.)


나는 얼마 전에 비슷한 문제가 있었고 그것에 대해이 질문을했습니다. 나는 거기의 답변 (댓글 포함)이 귀하의 질문에 답할 것이라고 생각합니다. 요약:

  • GUI 스레드에서 컨트롤을 업데이트하려면 ObserveOn. 참조 System.Reactive.Windows.Forms.dll하면 .ObserveOn(form)편리한 것을 얻을 수 있습니다.
  • SubscribeOn구독에 대한 실제 호출이 발생하는 스레드를 제어합니다. 여기서 해결 된 문제는 여러 다른 스레드에서 이벤트 처리기를 추가하면 WinForms 및 WPF에서 예외가 발생한다는 것입니다.

또한, 포스트 사이의 관계를 알아내는 매우 도움이되었다 ObserveOn하고 SubscribeOn.


SubscribeOn스레드가 체인을 "전달"하는 것으로 설정하고 스레드가 체인을 "전달"하는 것으로 생각함으로써 이것을 이해하는 데 도움이되었습니다 ObserveOn.

구독자 스레드 "전달됨"및 관찰자 스레드 "전달됨"

아래 코드는 플레이 할 수있는 명명 된 스레드를 사용합니다.

Thread.CurrentThread.Name = "Main";

IScheduler thread1 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread1" });
IScheduler thread2 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread2" });

Observable.Create<int>(o =>
{
    Console.WriteLine("Subscribing on " + Thread.CurrentThread.Name);
    o.OnNext(1);
    return Disposable.Create(() => {});
})
.SubscribeOn(thread1)
.ObserveOn(thread2)
.Subscribe(x => Console.WriteLine("Observing '" + x + "' on " + Thread.CurrentThread.Name));

위의 출력은 다음과 같습니다.

Subscribing on Thread1 Observing 1 on Thread2

SubscribeOn을 주석 처리 할 때 출력이 다음과 같다는 것도 흥미 롭습니다 .

Subscribing on Main Observing 1 on Thread2

기본적으로 구독은 실행중인 스레드 ( Main여기)를 "통과"하기 때문 입니다. 그런 다음 ObserveOn"통과" Thread2.

대신 ObserveOn줄을 주석 처리 하면 출력은 다음과 같습니다.

Subscribing on Thread1 Observing 1 on Thread1

에서 구독을 "전달"하고 Thread1기본적으로이 동일한 스레드가 "전달"되어 관찰을 실행하는 데 사용되기 때문입니다.

GUI 컨텍스트에서 응답 성을 유지하려면 GUI 스레드에서 최소한의 작업을 원하지만 UI 업데이트를 동기화하기 위해 GUI 스레드에서 구독을 완료 해야 합니다. 따라서 GUI 스레드에서 .ObserveOn을 원합니다.


차이점은 기본적으로 subscribeOn을 사용하면 전체 파이프 라인이 다른 스레드에서 처리되도록 강제하지만, observerOn을 사용하면 파이프 라인의 단계 만 옵저버 온 이후에 정의 된 단계 만 다른 스레드에서 실행되도록 설정 한 후에 다른 스레드에서 실행됩니다.

    Observable.just(1) 
              .map ---> executed in io thread
              .filter ---> executed in io thread
              .subscribeOn(Scheduers.io)
              .subscribe()

파이프 라인의 모든 단계는 다른 스레드에서 실행됩니다.

 Observable.just(1) 
              .map ---> executed in Main thread
              .filter ---> executed in Main thread
              .observerOn(Scheduers.io)
              .map ---> executed in New thread
              .filter ---> executed in New thread
              .subscribe()

참고 URL : https://stackoverflow.com/questions/7579237/whats-the-difference-between-subscribeon-and-observeon

반응형