2017-10-21 8 views
3

This question은 UI 스케줄러를 Throttle으로 전달하여 UI 스레드에서 IObservable<>.Throttle이 실행되도록하는 방법을 설명합니다. 그러나 Observables는 .NET Standard 1.5를 기반으로하는 공유 라이브러리에 정의되어 있습니다. DispatcherScheduler.Instance에 상응하는 .NET 표준이 있습니까? 아니면 소비하는 (WPF/UWP/etc) 라이브러리에서 스케줄러를 삽입해야합니까?.NET 표준 라이브러리의 Dispatcher IScheduler에 액세스

+0

을 가지고 예, 모든 WPF/UWP 코드에 대한 디스패치 스케줄러를 사용해야합니다. – Enigmativity

+0

@Enigmativity DispatcherScheduler.Instance는 .NET 표준 프로젝트에서 찾을 수 없습니다. WPF 및 .NET 표준 프로젝트에서 System.Reactive 4.0 (pre)을 비교했습니다. WPF는 여전히 DispatcherScheduler.Instance를 알고 있습니다. .NET 표준은 그렇지 않습니다. –

답변

1

클래스 DispatcherScheduler가 .NET Standard 용 System.Reactive 어셈블리에 없습니다.

가능한 해결 방법은 현재 SynchronizationContextSynchronizationContextScheduler을 사용하는 것입니다. ObserveOn()이 호출 될 때 UI 스레드를 사용할 때 관찰 가능 객체의 처리기는 UI 스레드에서 실행됩니다.

UI 스레드에서 ObserveOn()이 호출되지 않으면 모든 것이 작동하지 않습니다. 이 경우를 피하려면 AppContext 객체를 만들고 UI 초기화가 수행되는 동안 설정하고 응용 프로그램에 배포 할 수있게 만들 수 있습니다. 이 안에 SynchronizationContext.Current을 저장하고 AppContext이있는 모든 곳의 UI 스레드에서 관찰자를 만들 수 있습니다.

IObservable<EventArgs> myObservable = GetSomeObservableEvents(); 
var myScheduler = new SynchronizationContextScheduler(SynchronizationContext.Current); 
myObservable.ObserveOn(myScheduler).Subscribe(ev => 
{ 
    // some code that should run on UI thread 
}); 

가 나는 등 ViewModels, 조회수 등을 포함 .NET 표준 2.0에서 앱 프로젝트를 가지고 Xamarin.Forms 2.5.0 프로젝트에서 다음과 같이 사용하십시오.

이 대답은 (적어도)이 조건에서 유효합니다

  • .NET 표준 프로젝트 버전 2.0
  • System.Reactive 버전 4.0.0 - preview00001
+0

답변 해 주셔서 감사합니다. 그 동안 잠시 있었지만 기억으로부터 나는 비슷한 접근법을 따르고 관찰자들에게 맥락을 전달했습니다. –