Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AggregateException中的TaskCanceledException不包含堆栈跟踪_C#_.net 4.0_Task Parallel Library_Cancellation_Aggregateexception - Fatal编程技术网

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

C# AggregateException中的TaskCanceledException不包含堆栈跟踪,c#,.net-4.0,task-parallel-library,cancellation,aggregateexception,C#,.net 4.0,Task Parallel Library,Cancellation,Aggregateexception,我使用任务并行库来运行一个任务,该任务在被取消时抛出OperationCanceledException,然后使用AggregateException捕获它,如下所示。AggregateException包含TaskCanceledException的列表,这些异常对应于抛出的异常。不幸的是,这些TaskCanceledException似乎正在丢失原始异常引发的堆栈跟踪。这是故意的吗 try { task1.Wait(); } catch (AggregateException agg

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

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: 

我认为这是出于设计,任务取消异常通常只有在任务被取消时才会抛出,以帮助任务退出。在这种情况下,堆栈跟踪有什么用途?尽管如此,我对设计取消例外的开发人员的思维过程并不了解,只是我的观点


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

请更新代码以反映您发布的结果!:)行“if(tcex!=null)”是否正确?看起来应该是“if(tcex==null)”@matthewatson-这个
if
过滤掉了其他异常。我已经更新了这个问题以反映您的评论。问题是,一旦抛出异常,堆栈跟踪在到达AggregateException捕获时丢失。需要堆栈跟踪的原因是出于日志目的;我在代码中的各个点调用ThrowIfCancellationRequested()。记录堆栈跟踪将允许我识别在哪一点确认取消请求。