c# – 我捕获的AggregateException没有我期望的异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 我捕获的AggregateException没有我期望的异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3256字,纯文字阅读大概需要5分钟。
内容图文
![c# – 我捕获的AggregateException没有我期望的异常](/upload/InfoBanner/zyjiaocheng/815/90579412143746e995626f29a02bad9d.jpg)
我正在使用任务并行库来设置一个任务链,如下所示,但我得到一个奇怪的异常处理经验,我不明白.
我使用Parallel.ForEach并调用一个包含对以下方法的调用的Action.这个Parallel.ForEach包含在try … catch(AggregateException)中,当发生异常时 – 就像在其中一个Parallel分支中那样 – 一个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);
解决方法:
让我们简化一下你的代码:
var t1 = Task.Factory.StartNew(a1);
var t2 = t1.ContinueWith(a2, TaskContinuationOptions.NotOnFaulted);
var t3 = t2.ContinueWith(a3, TaskContinuationOptions.NotOnFaulted);
t3.Wait();
现在假设a1抛出异常.会发生什么是t1出现故障(t1.Status == TaskStatus.Faulted).因此,t2无法运行(因为NotOnFaulted),因此它将被取消.但这不是你想象的那样:t2不会出现故障,它会被取消(t2.Status == TaskStatus.Canceled).但这意味着t3可以正常运行,如果它没有抛出,t3.Wait()不会抛出任何异常.
如何解决这个问题?首先,您可能不应该使用TaskContinuationOptions.NotOnFaulted,而是使用TaskContinuationOptions.OnlyOnRanToCompletion.但这并没有解决“消失”异常的问题.为了解决这个问题,我看到两种可能性:
>在每个延续的开头调用Wait(),不要使用任何TaskContinuationOptions.这意味着您可能会在AggregateException中包含一些异常,它本身包含在AggregateException中,该异常包含在另一个AggregateException等中.要解决此问题,您可以使用Flatten()或Handle().
>等待所有任务,使用Task.WaitAll(). WaitAll()将抛出一个AggregateException,它将包含原始异常以及因第一个异常而被取消的每个任务的TaskCanceledException.
内容总结
以上是互联网集市为您收集整理的c# – 我捕获的AggregateException没有我期望的异常全部内容,希望文章能够帮你解决c# – 我捕获的AggregateException没有我期望的异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。