堆栈跟踪与asynchronous/等待

很明显为什么堆栈跟踪会受到微软新的编程模式的影响。 我们现在有一个语义堆栈和一些物理的(我select的话)。

我看到的是一个exception的StackTrace属性(在debugging器中)是物理的,连接在一起:

 private async Task CheckFooAndBar() { var log = LogManager.GetLogger("Test"); log.Info("CheckFooAndBar"); try { await Foo(); } catch (Exception ex) { log.Info("StackTrace of last exception: " + ex.StackTrace); } Console.ReadKey(); } private async Task Foo() { await Task.Factory.StartNew(() => Thread.Sleep(1000)); await Bar(); await Task.Factory.StartNew(() => Thread.Sleep(1000)); } private async Task Bar() { await Task.Factory.StartNew(() => Thread.Sleep(1000)); throw new Exception(); await Task.Factory.StartNew(() => Thread.Sleep(1000)); } 

这给了:

 StackTrace of last exception: at NLogAsyncExceptionTestCase.Program.<Bar>d__d.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 53 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at NLogAsyncExceptionTestCase.Program.<Foo>d__8.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 44 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at NLogAsyncExceptionTestCase.Program.<CheckFooAndBar>d__0.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 30 

我的问题是:是否有一种(方便的,标准的)方法将其转换为语义上的正确回溯,如:

 CheckFooAndBar Foo Bar 

当然,堆栈中可能有等待和内联path碎片的混合。

我试图看看堆栈,因为它与.NET 4.5和SL5与asynchronous目标包,但尚未与WinRT。 输出来自.NET 4.5。

在SL5中,这是我主要做的,情况是更有问题的:在Silverlight中没有获取堆栈跟踪中的行号(即使具有提升的权限),这使得对上下文的需求更重要。

随着Visual Studio 2013和.NET 4.5.1,这个问题似乎被解决 – 而不是在.NET中。

有关更多信息,请参阅此博客文章 。