【问题标题】:The current thread has no Dispatcher associated with it当前线程没有与之关联的 Dispatcher
【发布时间】:2017-01-20 18:18:22
【问题描述】:

我正在创建一个 observable,并且我正在单独创建订阅:

class CustomQuery {
    string Name;
    IObservable<int> Occurrences;
}

public IEnumerable<CustomQuery> GatherCustomQueryObservables()
{
    yield return new CustomQuery() {
        Name = "NameXXX",
        Occurrences = Observable.Create<int>(
            observer => 
            {
                int occurrences = this.webservice.GetOccurrences()
                observer.OnNext(occurrences);
                return System.Reactive.Disposables.Disposable.Empty;
            }
    );
}

另一方面,还有另一种方法处理这些CustomQueries

public void CommitCustomQueryObservables(IEnumerable<CustomQuery> queries)
{
    foreach (CustomQuery query in queries)
    {
        query.Occurrences
            .Select(o => o)
            .SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default)
            .ObserveOn(System.Reactive.Concurrency.DispatcherScheduler.Current)
            .Subscribe(
                occurrences =>
                {
                    string strOccurrences = occurrences > 0 ? occurrences.ToString() : "";
                    this.Label.Text = strOccurrences;
                }
            );
    }
}

不过,我收到了 System.InvalidOperationException 异常:

当前线程没有与之关联的 Dispatcher。

stacktrace 的最后一行在

System.Reactive.Concurrency.DispatcherScheduler.get_Current(‌​).

我不太清楚如何处理它。

有什么想法吗?

【问题讨论】:

  • 您是在控制台或 WinForms 应用程序中运行此代码吗? DispatcherScheduler 只能用于 WPF 应用程序。此外,如果您打算对此代码进行单元测试,通常最好注入您打算使用的调度程序,而不是使用上面显示的静态调度程序。
  • 是的,我在 WinForms 应用程序中运行此代码。没有办法达到这个目标吗?我刚刚安装了System.Reactive.Winforms.Forms nuget 参考,但是,它让我遇到了同样的异常。

标签: system.reactive


【解决方案1】:

对于 Windows 窗体,您需要使用 ControlScheduler 进行同步,而不是 DispatcherScheduler。

现在您已经添加了System.Reactive.Windows.Forms 包,这可以通过简单地使用[observable].ObserveOn([control]) 来实现;在您的示例中,这可能是:

public void CommitCustomQueryObservables(IEnumerable<CustomQuery> queries)
{
    foreach (CustomQuery query in queries)
    {
        query.Occurrences
            .Select(o => o)
            .SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default)
            .ObserveOn(this.Label)
            .Subscribe(
                occurrences =>
                {
                    string strOccurrences = occurrences > 0 ? occurrences.ToString() : "";
                    this.Label.Text = strOccurrences;
                }
            );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多