AggregateException中的TaskCanceledException不包含堆栈跟踪

ste*_*far 6 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

InnerException:, Message:A task was canceled., Source:, StackTrace: 
Run Code Online (Sandbox Code Playgroud)

Ken*_*Ito 1

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

我不太清楚他们丢失原始异常引发的堆栈跟踪是什么意思?通常他们不会有内部/原始例外。也许您由于其他异常而取消任务?在这种情况下,您应该捕获上游的“原始”异常,将其记录在那里,然后取消。

  • 需要堆栈跟踪的原因是出于日志记录的目的;我在代码中的各个点上调用 ThrowIfCancellationRequested() 。记录堆栈跟踪将使我能够确定取消请求在哪个点被确认。 (4认同)