반응형
async / await로 추적 스택
스택 추적이 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
물론 스택에 awaits와 inline path 조각이 섞여있을 수 있습니다.
비동기 타게팅 팩이있는 .NET 4.5 및 SL5와 함께 스택을 살펴 보았지만 아직 WinRT를 사용하지 않았습니다. 출력은 .NET 4.5에서 가져온 것입니다.
제가 주로하는 SL5에서는 상황이 더 문제가됩니다. Silverlight의 스택 추적에서 줄 번호를 얻지 못하기 때문에 컨텍스트가 더 중요해집니다.
Visual Studio 2013 및 .NET 4.5.1에서이 문제는 .NET뿐만 아니라 해결 된 것으로 보입니다.
자세한 내용은 이 블로그 게시물을 참조하십시오 .
참조 URL : https://stackoverflow.com/questions/13884437/stack-traces-with-async-await
반응형
'code' 카테고리의 다른 글
matplotlib 그림을 만든 후 어떻게 메모리를 해제 할 수 있습니까? (0) | 2020.12.26 |
---|---|
블렌더 : 구 주변 걷기 (0) | 2020.12.26 |
변경된 파일 만 다시 컴파일하도록 Makefile을 만들려면 어떻게해야합니까? (0) | 2020.12.25 |
Pinterest와 같은 Android 이기종 gridview? (0) | 2020.12.25 |
사용자 지정 권한 부여 MVC4 Web Api에서 게시물 액세스 또는 매개 변수 가져 오기 (0) | 2020.12.25 |