기다리고있는 메서드의 본문에 중단 점을 설정하면 Visual Studio 디버거에서 생성 된 C# 컴파일러 코드가없는 호출 스택을 표시합니다.Visual Studio 디버거가 await 키워드에 의해 생성 된 상태 코드를 표시하지 않는 이유는 무엇입니까?
내 간단한 async
방법과 통화 스택을 보여주는 아래 그림을 참조하십시오.
MoveNext
또는 상태 머신 객체를 초기화하거나
TaskAwaiter<TResult>
또는 호출 스택의
AsyncTaskOfTMethodBuilder
에는 전화가 없음을
알 수 있습니다.
왜 그렇습니까? IL Spy에있는 것처럼 디버깅 세션이 진행되는 동안 호출 스택과 편집기에서 상태 시스템 코드를 표시하도록 전환 할 수있는 Visual Studio의 설정이 있습니까?
갑자기 상태 기계를 인스턴스화하는 다시 작성 단추 클릭 핸들러 코드에 DebuggerStepThroughAttribute
이 있다는 것을 기억했습니다. 하지만 그 이유는 디버거에서 숨겨져 있는지 확실하지 않습니다. 이것은 컴파일러의 스택 프레임을 회색으로 표시해서는 안되며 호출 스택에서 메소드를 생성해야합니까?
DebuggerHiddenAttribute
은 디버거에서 코드를 볼 수 없게 만드는 코드가 아닙니까?
브레이크 포인트는 다른 스레드에서 실행중인 작업 내에 있으며, 왜 그 스레드를 만들었는지에 대한 증거가 있어야합니까? 디버거에서 얻을 수있는 별도의 스레드 창을 확인 했습니까?그래도 이름은 기억이 나지 않지만 열 수있는 창/창이 프로그램의 모든 스레드 상태를 보여줍니다. –
그러나 문제는 단추 클릭 이벤트 처리 메서드가 일시적으로 완료된다는 것입니다. 반환 된, 여분의 스레드의 스핀 업 동안 첫 번째 밀리 초에서 일어난이 가능성이 작업을 실행하는 스레드의 호출 스택 단추 이벤트 처리기를 표시하지 않을뿐만 아니라 찾고있는 메서드를 가장 가능성이 있음을 의미합니다 이미 반환되었습니다. –