为什么我的RX链阻塞?

时间:2014-07-08 17:24:04

标签: c# system.reactive

所以我有以下RX更改,但它似乎阻止选择,好像要保留顺序。我的理解是它应该继续委托给任务池吗?

var observable = Observable.Interval(TimeSpan.FromMilliseconds(10));

observable.ObserveOn(Scheduler.TaskPool)
    .Select(
    i =>
    {
        Console.WriteLine("Here" + System.Threading.Thread.CurrentThread.ManagedThreadId);
        System.Threading.Thread.Sleep(5000);
        return i;
    })
    .ObserveOn(Scheduler.TaskPool)
    .SubscribeOn(Scheduler.TaskPool)
    .Subscribe(i => { Console.WriteLine(i); });

1 个答案:

答案 0 :(得分:6)

确保事件以串行方式传递给用户是Rx语法的核心部分,也是其正确操作的基础。它在大多数Rx操作符中强制执行,您不应该违反此操作。

ObserveOn和SubscribeOn的机制完全得到了解决here

ObserveOn的目的是避免阻塞调度事件的observable的线程和/或控制订阅者接收事件的线程(在您的情况下使用任务池来传递它们)。

它不做的是允许订阅者同时接收事件 - 正如我所说,这将违反Rx的规则。

您可能会在值得阅读的类似主题上找到this个问题。