System.reactive 当前线程没有与其关联的调度程序

System.reactive 当前线程没有与其关联的调度程序,system.reactive,System.reactive,我正在创建一个可观察的,我正在单独创建订阅: class CustomQuery { string Name; IObservable<int> Occurrences; } public IEnumerable<CustomQuery> GatherCustomQueryObservables() { yield return new CustomQuery() { Name = "NameXXX", Occur

我正在创建一个可观察的,我正在单独创建订阅:

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;
            }
    );
}
然而,我得到了一个
系统。invalidoOperationException
异常:

当前线程没有与其关联的调度程序

stacktrace的最后一行位于

System.Reactive.Concurrency.DispatcherScheduler.get_Current(‌​).
我不太明白怎么处理它


有什么想法吗?

对于Windows窗体,您需要使用来进行同步,而不是使用DispatchersScheduler

现在,您已经添加了
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;
                }
            );
    }
}
public void CommitCustomQueryObservables(IEnumerable查询)
{
foreach(查询中的自定义查询)
{
查询.事件
.选择(o=>o)
.SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default)
.ObserveOn(此.Label)
.订阅(
事件=>
{
字符串strOccurrences=出现次数>0?出现次数。ToString():“”;
this.Label.Text=频发;
}
);
}
}

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

现在,您已经添加了
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;
                }
            );
    }
}
public void CommitCustomQueryObservables(IEnumerable查询)
{
foreach(查询中的自定义查询)
{
查询.事件
.选择(o=>o)
.SubscribeOn(System.Reactive.Concurrency.TaskPoolScheduler.Default)
.ObserveOn(此.Label)
.订阅(
事件=>
{
字符串strOccurrences=出现次数>0?出现次数。ToString():“”;
this.Label.Text=频发;
}
);
}
}

您是在控制台还是WinForms应用程序中运行此代码?DispatchersScheduler只能与WPF应用程序一起使用。此外,如果您打算对这段代码进行单元测试,通常最好插入您打算使用的调度程序,而不是使用上面显示的静态调度程序。是的,我正在WinForms应用程序中运行这段代码。难道没有办法达到这个目标吗?我刚刚安装了
System.Reactive.Winforms.Forms
nuget参考,但是,它给我带来了相同的异常。您是在控制台还是Winforms应用程序中运行此代码?DispatchersScheduler只能与WPF应用程序一起使用。此外,如果您打算对这段代码进行单元测试,通常最好插入您打算使用的调度程序,而不是使用上面显示的静态调度程序。是的,我正在WinForms应用程序中运行这段代码。难道没有办法达到这个目标吗?我刚刚安装了
System.Reactive.Winforms.Forms
nuget reference,不过,它给我带来了同样的异常。