0

我的 Windows 8 应用商店应用中有以下代码:

    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 的有效窗口。

我在堆栈溢出的其他地方看到了WPF的变通方法。但这看起来只是让调度程序运行的东西。这个错误似乎更根本。有已知的解决方法吗?

4

1 回答 1

3

(编辑:更好的格式,因为我有一个键盘而不是电话)

还有另一种实现相同功能的方法:

.ObserveOnDispatcher() 

相当相当于:

.ObserveOn(new DispatcherScheduler(Dispatcher.CurrentDispatcher))

现在,而不是那个 DispatcherScheduler,有一个像这样的类:

public static class Schedulers
{
    public static IScheduler Dispatcher {get; internal set;}    
}

并将用法更改为:

.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);
    }
}
于 2013-02-28T07:06:18.793 回答