Каковы планировщики по умолчанию для каждого наблюдаемого оператора?

На этой странице в MSDN указано, что

Если вы не используете перегрузку, которая принимает планировщик в качестве аргумента, Rx выберет планировщик по умолчанию, используя принцип наименьшего параллелизма. Это означает, что выбирается планировщик, обеспечивающий наименьшее количество параллелизма, который удовлетворяет потребности оператора. Например, для операторов, возвращающих наблюдаемое с конечным и небольшим количеством сообщений, Rx вызывает Immediate. Для операторов, возвращающих потенциально большое или бесконечное количество сообщений, вызывается CurrentThread. Для операторов, использующих таймеры, используется ThreadPool.

Я хотел бы иметь справочный лист, для которого наблюдаемые операторы используют планировщик по умолчанию, но я нигде не могу его найти. Каковы планировщики по умолчанию для каждого наблюдаемого оператора?


person AlexFoxGill    schedule 11.03.2013    source источник
comment
Я на самом деле удивлен, что где-то нет списка ... если у меня будет время, чтобы погрузиться в него, я пройдусь по кодовой базе rx и посмотрю, смогу ли я скомпилировать список, но нет, я не знаю любых плавающих вокруг сетей ...   -  person JerKimball    schedule 13.03.2013
comment
Да я тоже рыскал, безрезультатно. Некоторые из них очевидны, но некоторые на самом деле нет!   -  person AlexFoxGill    schedule 13.03.2013


Ответы (1)


Ого, найти было не просто...

Глубоко в недрах пространства имен System.Reactive.Concurrency есть внутренний статический класс с именем SchedulerDefaults, который объявлен как:

internal static class SchedulerDefaults
{
    internal static IScheduler AsyncConversions 
    { get { return DefaultScheduler.Instance; }}

    internal static IScheduler ConstantTimeOperations 
    { get { return ImmediateScheduler.Instance; }}

    internal static IScheduler Iteration 
    { get { return CurrentThreadScheduler.Instance; }}

    internal static IScheduler TailRecursion 
    { get { return ImmediateScheduler.Instance; }}

    internal static IScheduler TimeBasedOperations 
    { get { return DefaultScheduler.Instance; }}
}

AsyncConversions используется:

Start, ToAsync, FromAsyncPattern

ConstantTimeOperations используется:

Empty, GetSchedulerForCurrentContext, Return, StartWith, Throw

Iteration используется:

Generate, Range, Repeat, TakeLast, ToObservable, and the ReplaySubject<T>

TailRecursion используется:

Run

TimeBasedOperations используется:

Buffer, Delay, DelaySubscription, Generate, Interval, Sample, Skip, SkipLast
SkipUntil, Take, TakeLast, TakeLastBuffer, TakeUntil, Throttle, TimeInterval,
Timeout, Timer, Timestamp, Window
person JerKimball    schedule 13.03.2013
comment
В идеале вы должны передавать свой собственный планировщик всякий раз, когда вы используете любой из этих методов, чтобы вы могли модульно протестировать свой код. Но всегда полезно знать, какой из них лучше всего использовать, поэтому этот список отлично подходит для этого! - person Lee Campbell; 22.03.2013
comment
@LeeCampbell Я лично был поражен тем, как глубоко мне пришлось копать, чтобы найти это ... боже. Согласен на 100% использовать свой проклятый планировщик. - person JerKimball; 22.03.2013
comment
Спасибо. А как насчет Where, Select и Do? - person Colonel Panic; 01.12.2014
comment
@ColonelPanic - почти уверен, что Where и Select не запускаются через какой-либо планировщик - не уверен насчет Do. - person JerKimball; 01.12.2014
comment
Do, конечно, тоже нет. - person Alastair Maw; 09.12.2014