У меня есть конвейер потока данных TPL, в котором целевой блок связан с двумя распространяющимися блоками, которые затем оба связаны с исходным блоком. Все они связаны с PropagateCompletion = true. Первый распространяющий блок связан с фильтром, принимающим только четные числа, а второй принимает все оставшиеся сообщения.
После публикации последнего сообщения я устанавливаю первый блок как завершенный. Однако, похоже, существует состояние гонки. Кажется, что последний блок иногда обрабатывает все значения, но иногда только те значения, которые были приняты первым блоком распространения, и только часть значений, которые были приняты вторым блоком распространения.
Я чувствую, что существует состояние гонки. Но я понятия не имею, как правильно проинструктировать окончательный исходный блок о том, что все завершено, только после того, как оба связанных с ним распространяющих блока пересылают все свои сообщения.
Вот мой код сокращен до простого примера:
internal static class Program
{
public static async Task Main(string[] args)
{
var linkOptions = new DataflowLinkOptions
{
PropagateCompletion = true
};
var bufferBlock = new BufferBlock();
var fork1 = new TransformBlock(n => n);
var fork2 = new TransformBlock(n =>
{
Thread.Sleep(100);
return n;
});
var printBlock = new ActionBlock(Console.WriteLine);
bufferBlock.LinkTo(fork1, linkOptions, n => n % 2 == 0);
bufferBlock.LinkTo(fork2, linkOptions, n => n % 2 != 0);
fork1.LinkTo(printBlock, linkOptions);
fork2.LinkTo(printBlock, linkOptions);
for (var n = 1; n
Подробнее здесь: https://stackoverflow.com/questions/729 ... w-pipeline
Как правильно дождаться завершения при разветвлении конвейера потока данных TPL? [дубликат] ⇐ C#
Место общения программистов C#
1734452915
Anonymous
У меня есть конвейер потока данных TPL, в котором целевой блок связан с двумя распространяющимися блоками, которые затем оба связаны с исходным блоком. Все они связаны с PropagateCompletion = true. Первый распространяющий блок связан с фильтром, принимающим только четные числа, а второй принимает все оставшиеся сообщения.
После публикации последнего сообщения я устанавливаю первый блок как завершенный. Однако, похоже, существует состояние гонки. Кажется, что последний блок иногда обрабатывает все значения, но иногда только те значения, которые были приняты первым блоком распространения, и только часть значений, которые были приняты вторым блоком распространения.
Я чувствую, что существует состояние гонки. Но я понятия не имею, как правильно проинструктировать окончательный исходный блок о том, что все завершено, только после того, как оба связанных с ним распространяющих блока пересылают все свои сообщения.
Вот мой код сокращен до простого примера:
internal static class Program
{
public static async Task Main(string[] args)
{
var linkOptions = new DataflowLinkOptions
{
PropagateCompletion = true
};
var bufferBlock = new BufferBlock();
var fork1 = new TransformBlock(n => n);
var fork2 = new TransformBlock(n =>
{
Thread.Sleep(100);
return n;
});
var printBlock = new ActionBlock(Console.WriteLine);
bufferBlock.LinkTo(fork1, linkOptions, n => n % 2 == 0);
bufferBlock.LinkTo(fork2, linkOptions, n => n % 2 != 0);
fork1.LinkTo(printBlock, linkOptions);
fork2.LinkTo(printBlock, linkOptions);
for (var n = 1; n
Подробнее здесь: [url]https://stackoverflow.com/questions/72977833/how-to-properly-wait-for-completion-when-having-forked-tpl-dataflow-pipeline[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия