J'utilise TPL
blocs pour effectuer une opération qui peut être annulée par l'utilisateur : J'ai trouvé deux options, dans la première j'annule tout le bloc mais n'annule pas l'opération à l'intérieur du bloc, comme ceci :
_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 });
et la seconde j'annule l'opération interne, mais pas le bloc lui-même :
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;
});
Si j'ai bien compris, la première option annule tout le bloc, ce qui entraîne l'arrêt de tout le pipeline. Ma question est de savoir si cela annulera également l'opération interne et disposera de toutes les ressources s'il y en a (StreamReaders ouverts, etc.) ou s'il vaut mieux choisir la deuxième option car je pourrai alors m'assurer moi-même que tout est annulé et nettoyé, puis je pourrai utiliser des moyens (programmation ferroviaire) pour faire remonter les données. OperationCanceledException
dans le tuyau et m'en occuper où je veux ?