Подтвердить что ты не робот

Трассировка стека с помощью async/wait

Это ясно, почему трассировка стека зависит от новой парадигмы программирования 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.<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

Конечно, в стеке может быть смесь ожиданий и встроенных фрагментов пути.

Я попытался взглянуть на стек, как и на .NET 4.5 и SL5, с пакетом async-таргетинга, но еще не с WinRT. Выход из .NET 4.5.

В SL5, что я в основном делаю, ситуация более проблематична: вы не получаете номера строк в стеках в Silverlight (даже с повышенными привилегиями), что делает необходимость в контексте более важным.

4b9b3361

Ответ 1

С Visual Studio 2013 и .NET 4.5.1 эта проблема, как представляется, устранена - и не только в .NET.

Для получения дополнительной информации см. этот пост в блоге.