Rx Scheduler и Thread affinity - PullRequest
       0

Rx Scheduler и Thread affinity

2 голосов
/ 14 декабря 2011

Не могу понять, как работает планировщик в Rx Framework. Я запускаю код, упоминаю ниже и получаю, что «Выбрать поток» и «Подписаться на поток» выдает одинаковые значения, а основной поток выдает другое значение. Я думал, что «основной поток» и «подписка потока» должны иметь одно и то же значение, а «выбрать поток» должен иметь другое.

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 Ответ

4 голосов
/ 15 декабря 2011

Вы совершили ту же ошибку, что, как мне кажется, все делают, когда впервые смотрели на планировщики - я, конечно, сделал.

Ошибка в том, что Scheduler.CurrentThread использует поток, который определил observable - вместо этого это поток, который выполняет observable.

Таким образом, Select вызывается только тогда, когда на наблюдаемое подписано, и так как вы подписались на него вThreadPool это также будет наблюдаться в том же потоке (CurrentThread).

...