Почему AsObservable, используемый с BroadCastBlock, не получает все значенияC#

Место общения программистов C#
Ответить
Anonymous
 Почему AsObservable, используемый с BroadCastBlock, не получает все значения

Сообщение Anonymous »

Я экспериментировал с трансляцией BroadcastBlock наблюдателям. Однако я обнаружил, что это работает не совсем так, как я ожидал.
Это пример, демонстрирующий разницу между двумя ActionBlock, все значения которых передаются в их и наличие двух IObserver, которые не получают все значения:

Код: Выделить всё

var broadCastBlock = new BroadcastBlock(i => i);

Func actionGenerator =
(s) => (int i) => Console.WriteLine(s + " " + i);

Action actionFoo = actionGenerator("FOO");
Action actionBar = actionGenerator("BAR");

var actionBlockFoo = new ActionBlock(actionFoo);
var actionBlockBar = new ActionBlock(actionBar);
broadCastBlock.LinkTo(actionBlockFoo);
broadCastBlock.LinkTo(actionBlockBar);
for (int i = 0; i < 5; i++) {
broadCastBlock.Post(i);
}

Thread.Sleep(1000);
Console.WriteLine("-Observable-");
broadCastBlock = new BroadcastBlock(i => i);
var observable = broadCastBlock.AsObservable();
observable.Subscribe(actionFoo);
observable.Subscribe(actionBar);
for (int i = 0; i < 5; i++) {
broadCastBlock.Post(i);
}
Thread.Sleep(1000);
Выход:

Код: Выделить всё

BAR 0
FOO 0
FOO 1
BAR 1
BAR 2
BAR 3
BAR 4
FOO 2
FOO 3
FOO 4
-Observable-
FOO 0
BAR 0
FOO 4
BAR 4
Интересно, что печатается только первое и последнее значение. Я тестировал свою собственную фиктивную реализацию IObserver, которая дает те же результаты, что и удобный метод расширения из приведенного выше кода. Этого не происходит, когда я использую BufferBlock, но опять же, я ограничен только одной целью.
Почему это происходит и как я могу обеспечить получение всех значения, передаваемые моим наблюдателям так же, как и для ActionBlock?

Подробнее здесь: https://stackoverflow.com/questions/791 ... all-values
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»