Почему 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

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