Я использую блоки TPL
для выполнения операции, которая может быть отменена пользователем: у меня есть два варианта, сначала я отменяю весь блок, но не отменяю операцию внутри блока, например:
_downloadCts = new CancellationTokenSource();
var processBlockV1 = new TransformBlock<int, List<int>>(construct =>
{
List<int> properties = GetPropertiesMethod(construct );
var entities = properties
.AsParallel()
.Select(DoSometheningWithData)
.ToList();
return entities;
}, new ExecutionDataflowBlockOptions() { CancellationToken = _downloadCts.Token });
, а во втором - отменяю внутреннюю операцию, но не сам блок:
var processBlockV2 = new TransformBlock<int, List<int>>(construct =>
{
List<int> properties = GetPropertiesMethod(construct);
var entities = properties
.AsParallel().WithCancellation(_downloadCts.Token)
.Select(DoSometheningWithData)
.ToList();
return entities;
});
Как я понимаю, первый вариант отменяет весь блок, таким образом закрывая весь конвейер. Мой вопрос в том, будет ли он также отменять внутреннюю операцию и избавляться от всех ресурсов, если они есть (открытые StreamReaders и т. Д.), Или лучше выбрать второй вариант, тогда я сам могу убедиться, что все отменено и очищено, а затем я мог бы использовать какие-то средства (железнодорожное программирование), чтобы спустить поднятый OperationCanceledException
вниз по трубе и обрабатывать его там, где я хочу?