我正在使用任务并行库来设置一系列任务,如下所示,但我遇到了一个奇怪的异常处理体验,我不明白其中的原因。
我使用 Parallel.ForEach 并调用包含以下方法调用的操作。这个 Parallel.ForEach 被包裹在 try...catch(AggregateException) 中,当出现异常 - 就像在其中一个并行分支中发生的 SchemaValidation 异常一样 - 我会期望在 AggregateException 中看到它。
然而,我得到的是 '任务已取消' - TaskCanceledException。我的 SchemaValidationException 去哪了?
我使用 Parallel.ForEach 并调用包含以下方法调用的操作。这个 Parallel.ForEach 被包裹在 try...catch(AggregateException) 中,当出现异常 - 就像在其中一个并行分支中发生的 SchemaValidation 异常一样 - 我会期望在 AggregateException 中看到它。
然而,我得到的是 '任务已取消' - TaskCanceledException。我的 SchemaValidationException 去哪了?
private static void ProcessChunk(Task<ISelectedChunk> selectionTask,
IRepository repository,
IIdentifiedExtractChunk identifiedExtractChunk,
IBatchRunConfiguration batchRunConfiguration,
IBatchRun batchRun,
ILog log,
IAuthenticationCertificate authenticationCertificate,
IFileSystem fileSystem,
long batchRunRid)
{
var transformationTask = selectionTask.ContinueWith(TransformationFunction.Transformation(identifiedExtractChunk, batchRunConfiguration, batchRun),
TaskContinuationOptions.NotOnFaulted);
var schemaValidationTask = transformationTask.ContinueWith(SchemaValidationFunction.SchemaValidationTask(batchRunConfiguration),
TaskContinuationOptions.NotOnFaulted);
var compressTask = schemaValidationTask.ContinueWith(CompressFunction.CompressTask(identifiedExtractChunk),
TaskContinuationOptions.NotOnFaulted);
var encryptTask = compressTask.ContinueWith(EncryptionFunction.EncryptTask(authenticationCertificate),
TaskContinuationOptions.NotOnFaulted);
var fileGenerationTask = encryptTask.ContinueWith(FileGenerationFunction.FileGenerationTask(identifiedExtractChunk, batchRunConfiguration, fileSystem),
TaskContinuationOptions.NotOnFaulted);
// Take the time before we start the processing
DateTime startBatchItemProcessing = DateTime.Now;
// Start with the Selection Task
selectionTask.Start();
// And wait on the last task in the chain
fileGenerationTask.Wait();
// Take the time at the end of the processing
DateTime endBatchItemProcessing = DateTime.Now;
// Record all the relevant information and add it to the collection
IBatchChunkProcessed batchChunkProcessed = GetBatchItemProcessed(identifiedExtractChunk, batchRunRid, fileGenerationTask.Result, transformationTask.Result.Item2, startBatchItemProcessing, endBatchItemProcessing);
BatchItemsProcessed.Add(batchChunkProcessed);