2013-02-28 1 views
0

내 윈도우 8 스토어 앱에서 다음과 같은 코드가 있습니다CoreDispatcher는

public static void ConvertUpdateStreamToCollection<T>(this IObservable<UpdateInfo<T>> input, ObservableCollection<T> list) 
    { 
     input 
      .ObserveOnDispatcher() 
      .Subscribe(upInfo => UpdateList(upInfo, list)); 
    } 

는 ObserveOnDispatcher가 주전 것을 이것은 종종 백그라운드 스레드에서 호출되며 관찰 가능 목록을 업데이트 할 때 UI 디스패처에 있어야합니다. 우선 앱을 실행할 때 제대로 작동하는 것처럼 보입니다.

하지만 단위 테스트를 통해 테스트 해 보겠습니다. MSTest가 내장되어 있습니다. 그러나 ObserveOnDispatcher는 CoreDispatcher를 가져올 유효한 Window가 없다고 불평합니다.

스택 오버플로의 다른 위치에서 WPF에 대한 해결 방법을 보았습니다. 하지만 디스패처를 실행시키는 것처럼 보입니다. 이 오류는 더 근본적인 것 같습니다. 알려진 해결 방법이 있습니까?

답변

2

은 (편집 : 지금은 대신 전화의 키보드를 가지고 더 나은 형식)

가 동일한 기능을 달성하기위한 또 다른 방법 :

.ObserveOn(new DispatcherScheduler(Dispatcher.CurrentDispatcher)) 
:

.ObserveOnDispatcher() 

을 상당히 동일합니다

DispatcherScheduler 대신 다음과 같은 클래스를 사용하십시오.

(210)

그리고 변화 사용량 :

.ObserveOn(Schedulers.Dispatcher) 

예 :

void Main() 
{ 
    // For normal usage, we'll set this to the proper DispatcherScheduler 
    Schedulers.Dispatcher = new DispatcherScheduler(Dispatcher.CurrentDispatcher); 

    // Do stuff 
    new Thingy().DoStuff(); 

    // for testing usage, we'll set this to be the immediate scheduler 
    Schedulers.Dispatcher = Scheduler.Immediate; 

    // Do stuff 
    new Thingy().DoStuff(); 
} 

public class Thingy 
{ 
    public void DoStuff() 
    { 
     var query = Observable.Range(0, 10).ObserveOn(Schedulers.Dispatcher); 
     query.Subscribe(Console.WriteLine); 
    } 
} 
+0

감사합니다. 귀하의 게시물은 제가 Rx 소스 코드 (https://rx.codeplex.com/SourceControl/changeset/view/7881e17c060b#Rx/NET/Source/System.Reactive.Windows.Threading/Reactive/Linq/)를 볼 수 있음을 깨닫게했습니다. DispatcherObservable.cs). – Gordon

+0

빠른 질문이 여기 있습니다. 당신은 Dispatcher.CurrentDIspatcher를 사용하고 있습니다 ... 그것은 윈도우 스토어 앱의 전체 수명 동안 똑같이 될 것입니까? "Window"객체와 관련된 다른 객체를 얻게됩니까? – Gordon

+0

내가 생각했던 또 다른 솔루션은 테스트 모드에서 실행될 때 null op로 변경되는 셸 ObserveOnMyDispatcher를 작성한 것이고 WD 환경에서 실행될 때 "공식"ObserveOnDispatcher는 Dispatcher가 실행되는 동안 변경 될 가능성이 있으므로 WS 응용 프로그램에서 실행 중입니다 ... – Gordon