Может ли поток данных C# TPL распространять завершение в восходящем направлении? - PullRequest
0 голосов
/ 11 февраля 2020

При связывании блоков потока данных вы можете выбрать настройку «завершение распространения». Это, по существу, распространяет завершение от источника к цели.

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

Как бы я это сделал, используя поток данных TPL?

1 Ответ

2 голосов
/ 12 февраля 2020

Самый безопасный и прямой способ уничтожения потока данных - это передать токен отмены во все блоки, а затем отменить токен. Это более прямой вызов, чем Complete() для блока производителя и ожидание обработки последних элементов.

var cts = new CancellationTokenSource();

var producer = new BufferBlock<X>(new DataflowBlockOptions()
{
    CancellationToken = cts.Token
});

// ...

cts.Cancel();
...