Следы стека с асинхронным ожиданием
Это'Понятно, почему на трассировку стека влияет Microsoftновая парадигма программирования. Теперь у нас есть семантический стек и пара физических (мой выбор слов).
То, что я вижу, является исключениемStackTrace
Свойство (и в отладчике) это физические, сцепленные:
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.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.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.d__0.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 30
Мой вопрос: есть ли (удобный, стандартный) способ преобразовать это в правильную обратную трассировку в семантическом смысле, например:
CheckFooAndBar
Foo
Bar
Конечно, в стеке может быть смесь ожидающих и встроенных фрагментов пути.
Я попытался посмотреть на стек как на .NET 4.5 и SL5 с пакетом асинхронного таргетинга, но пока не на WinRT. Выход из .NET 4.5.
В SL5, чем я в основном занимаюсь, ситуация более проблематичная:t получить номера строк в трассировке стека в Silverlight (даже с повышенными привилегиями), что делает потребность в контексте более важной.