【问题标题】:Scheduling in Rx .NETRx .NET 中的调度
【发布时间】:2018-09-24 00:21:43
【问题描述】:

预计都在.NET Core 2.0控制台应用的主线程上执行,所以输出被阻塞10秒:

    static void Main(string[] args)
    {
        WriteLine($"We are on {Thread.CurrentThread.ManagedThreadId}");

        var subject = new Subject<long>();
        var subscription = subject.Subscribe(
            i => WriteLine($"tick on {Thread.CurrentThread.ManagedThreadId}"));

        var timer = Observable.Interval(TimeSpan.FromSeconds(1))
            .SubscribeOn(Scheduler.CurrentThread)
            .Subscribe(i => subject.OnNext(i));

        Thread.Sleep(10000);
    }

但情况并非如此 - 每隔一秒就会有一个新行进入控制台,由随机线程调度:

We are on 1
tick on 4
tick on 5
tick on 4
tick on 4
tick on 4
tick on 4
tick on 4
tick on 4
tick on 5

我做错了什么?

【问题讨论】:

    标签: c# .net-core system.reactive


    【解决方案1】:

    Scheduler.CurrentThread / CurrentThreadScheduler 将在调用调度的同一线程上排队项目,这将是计时器恰好运行的线程。调用 Scheduler.CurrentThread 不会将通过它调度的项目的执行固定到您调用 Scheduler.CurrentThread 的线程上,而是固定到调用 .Schedule() 的线程上。

    另外,您调用SubscribeOn() 只会影响将要进行.Subscribe() 调用的线程。如果你想控制item处理的执行,你宁愿调用.ObserveOn()

    如果你想让一切都在主线程上运行,我建议在主线程上运行计时器,方法是在可观察的时间间隔上指定一个调度程序:

    Observable.Interval(TimeSpan.FromSeconds(1), Scheduler.CurrentThread)
    

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多