Подтвердить что ты не робот

Что делают различные реализации ISubject и когда они будут использоваться?

У меня довольно хорошее представление о том, что делает класс Subject и когда его использовать, но я только что просмотрел ссылку на язык msdn и вижу, что существуют различные другие реализации ISubject, такие как:

  • AsyncSubject
  • BehaviorSubject
  • ReplaySubject

Поскольку документация довольно тонкая на земле, в чем смысл каждого из этих типов и в каких ситуациях вы могли бы использовать их?

4b9b3361

Ответ 1

Все эти предметы имеют общее свойство - они берут некоторые (или все) то, что отправляется им через OnNext, записывают и воспроизводят его обратно, то есть они берут Hot Observable и делают его холодным. Это означает, что если вы подпишитесь на какое-либо из них более одного раза (например, Подписаться = > Отменить подписку = > Подписать снова), вы увидите хотя бы одно из значений.

ReplaySubject. Каждый раз, когда вы подписываетесь на Субъект, вы получаете всю историю того, что было отправлено обратно вам, как можно быстрее (или подмножество, как и последние n элементов)

AsyncSubject. Всегда воспроизводит последний отправленный и завершенный элемент, но только после того, как источник завершен. Этот вопрос является прекрасным для асинхронных функций, так как вы можете писать их, не беспокоясь о состоянии гонки: даже если кто-то подписывается после завершения асинхронного метода, он получает результат.

BehaviorSubject: как будто ReplaySubject, но с буфером одного, поэтому вы всегда получаете последнее, что было опубликовано. Вы также можете указать начальное значение. Всегда предоставляет один элемент сразу на подписке.

Ответ 2

В свете последней версии (v1.0.2856.0) и чтобы этот вопрос обновлялся, появился новый набор тематических классов:

FastSubject, FastBehaviorSubject, FastAsyncSubject и FastReplaySubject

В соответствии с примечаниями к выпуску они

намного быстрее, чем обычные предметы но:

  • не отделять производителя и потребителя от IScheduler (эффективно ограничивая их ImmediateScheduler);
  • не защищать от;
  • Не синхронизировать входные сообщения.

Быстрые темы используются Publish и Сократить операторы, если планировщик не установлен указано.

Ответ 3

Что касается AsyncSubject

Этот код:

        var s = new AsyncSubject<int>();
        s.OnNext(1);
        s.Subscribe(Console.WriteLine);
        s.OnNext(2);
        s.OnNext(3);
        s.OnCompleted();

печатает одно значение 3. И он печатает то же самое, если подписка перенесена после завершения. Таким образом, он воспроизводит не первый, а последний элемент, воспроизводит его после завершения (до завершения, он не создает значений), и он не работает как объект до завершения. См. эту дискуссию об урожае для получения дополнительной информации (AsyncSubject в основном такой же, как и Prune)

Ответ 4

Пол отвечает довольно много ногтей. Однако есть несколько вещей, которые стоит добавить:

AsyncSubject работает, как говорит Пол, но только после того, как источник завершен. До этого он работает как Subject (где "живые" значения принимаются подписчиками)

AsyncSubject изменился с тех пор, как я прошёл тесты против него. Он больше не действует как живой объект до завершения, но ждет завершения, прежде чем он испустит значение. И, как упоминает Сергей, он возвращает последнее значение, а не первое (хотя я должен был поймать, что так всегда было)

AsyncSubject используется Prune, FromAsyncPattern, ToAsync и, возможно, несколько других

BehaviorSubject используется перегрузками Publish, которые принимают начальное значение

ReplaySubject используется Replay

ПРИМЕЧАНИЕ. Все приведенные выше ссылки на оператора относятся к издательскому набору операторов, как они были до того, как они были заменены обобщенными операциями публикации в rev 2838 (Christmas '10), как уже упоминалось, исходные операторы будут добавлены повторно