c# - AggregateException 中的 TaskCanceledException 不包含堆栈跟踪

标签 c# .net-4.0 task-parallel-library cancellation aggregateexception

我正在使用任务并行库来运行一个任务,该任务在取消时会抛出 OperationCanceledException,然后使用 AggregateException 捕获该异常,如下所示。 AggregateException 包含一个 TaskCanceledExceptions 列表,对应于抛出的异常。不幸的是,这些 TaskCanceledExceptions 似乎正在丢失原始异常抛出的堆栈跟踪。这是设计使然吗?

try
{
    task1.Wait();
}
catch (AggregateException aggEx)
{
    var tcex = ex as TaskCanceledException;
    if (tcex != null)
    {
        Debug.WriteLine("InnerException:{0}, Message:{1}, Source:{2}, StackTrace: {3}",
            tcex.InnerException, tcex.Message, tcex.Source, tcex.StackTrace);

        return true;
    }
    else
    {
        return false;
    }
}

结果:

InnerException:, Message:A task was canceled., Source:, StackTrace: 

最佳答案

我认为这是设计使然,任务取消异常通常仅在任务被取消时抛出,以帮助任务退出。堆栈跟踪在这种情况下有什么用途?话虽这么说,我并不了解设计取消异常(exception)的开发人员的思维过程,只是我的意见。

我不太确定您所说的他们丢失了原始异常抛出的堆栈跟踪是什么意思?通常他们不会有内部/原始异常。也许您由于其他一些异常而取消了任务?在那种情况下,您应该在上游捕获“原始”异常,将其记录在那里,然后取消。

关于c# - AggregateException 中的 TaskCanceledException 不包含堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10143683/

相关文章:

c# - 使用 PropertyDescriptor 可以确定属性是否在当前类中被覆盖

c# - 是否可以通过内存映射文件将实例 "pointer"传递给另一个进程?

NHibernate session (和无状态 session )和长时间运行的应用程序

c# - 为什么先执行return语句而不是Parallel.ForEach?

asp.net-mvc-4 - 在 MVC4 中使函数异步时 HttpContext.Current null

c# - ASP.NET MVC 渲染 Model 时如何绑定(bind) jQuery 事件

c# - 如何在单击 gridview 行时调用函数。这两个函数都放在 aspx 页面的脚本标签中

c# - 错误CS0234 : The type or namespace name 'VisualStudio' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?

c# - 使用关系更新数据表

c# - async await 不适合实现动态并行吗?