Il est clair pourquoi les traces de pile sont touchés avec Microsoft nouveau paradigme de programmation. Nous avons maintenant une sémantique de la pile et un couple de physique (mon choix de mots).
Ce que je vois est une exception de l' StackTrace
de la propriété (et dans le débogueur) est la physique, concaténés:
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));
}
Cela donne:
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
Ma question est: Est-il (pratique, standard) moyen de convertir ce pour une bonne trace dans le sens sémantique, tels que:
CheckFooAndBar
Foo
Bar
Bien sûr, il pourrait être un mélange de attend et dans la ligne de chemin de fragments dans la pile.
J'ai essayé de regarder la pile comme il est avec .NET 4.5 et SL5 avec async cibler pack, mais pas encore avec WinRT. La sortie est de .NET 4.5.
En SL5, qui est ce que je fais principalement, la situation est plus problématique: Vous n'obtenez pas les numéros de ligne dans les traces de pile dans Silverlight (même avec des privilèges élevés), ce qui rend le besoin pour le contexte de plus en plus important.