Rx调度程序和线程关联

时间:2011-12-14 16:22:40

标签: multithreading system.reactive

无法理解调度程序在Rx Framework中的工作原理。我运行代码,在下面提到并重新获得"选择线程"和"订阅线程"产生相同的值,主线程产生antoher值。我认为"主线"和"订阅线程"必须具有相同的值,并且"选择线程"必须有另一个。

var obs = Observable.Range(1, 10)
    .SubscribeOn(Scheduler.ThreadPool)
    .ObserveOn(Scheduler.CurrentThread);

var data = obs.Select(x =>
{
    Console.WriteLine("Select thread: {0}", Thread.CurrentThread.ManagedThreadId);
    return x;
});

data.Subscribe(x => Console.WriteLine("Subscribe thread: {0}", Thread.CurrentThread.ManagedThreadId));

Console.WriteLine("Main thread: {0}", Thread.CurrentThread.ManagedThreadId);

1 个答案:

答案 0 :(得分:4)

你犯了同样的错误,我认为每个人在第一次看到调度程序时都会这样做 - 我当然这样做了。

错误是认为Scheduler.CurrentThread使用了定义 observable的线程 - 而是执行 observable的线程。

所以Select仅在observable订阅时被调用,并且因为你已在ThreadPool上订阅它,它也会在同一个线程(CurrentThread)上被观察到。