2016-06-06 1 views
2

기다리고있는 메서드의 본문에 중단 점을 설정하면 Visual Studio 디버거에서 생성 된 C# 컴파일러 코드가없는 호출 스택을 표시합니다.Visual Studio 디버거가 await 키워드에 의해 생성 된 상태 코드를 표시하지 않는 이유는 무엇입니까?

내 간단한 async 방법과 통화 스택을 보여주는 아래 그림을 참조하십시오.

MoveNext 또는 상태 머신 객체를 초기화하거나 TaskAwaiter<TResult> 또는 호출 스택의 AsyncTaskOfTMethodBuilder에는 전화가 없음을

enter image description here

알 수 있습니다.

왜 그렇습니까? IL Spy에있는 것처럼 디버깅 세션이 진행되는 동안 호출 스택과 편집기에서 상태 시스템 코드를 표시하도록 전환 할 수있는 Visual Studio의 설정이 있습니까?

갑자기 상태 기계를 인스턴스화하는 다시 작성 단추 클릭 핸들러 코드에 DebuggerStepThroughAttribute이 있다는 것을 기억했습니다. 하지만 그 이유는 디버거에서 숨겨져 있는지 확실하지 않습니다. 이것은 컴파일러의 스택 프레임을 회색으로 표시해서는 안되며 호출 스택에서 메소드를 생성해야합니까?

DebuggerHiddenAttribute은 디버거에서 코드를 볼 수 없게 만드는 코드가 아닙니까?

+1

브레이크 포인트는 다른 스레드에서 실행중인 작업 내에 있으며, 왜 그 스레드를 만들었는지에 대한 증거가 있어야합니까? 디버거에서 얻을 수있는 별도의 스레드 창을 확인 했습니까?그래도 이름은 기억이 나지 않지만 열 수있는 창/창이 프로그램의 모든 스레드 상태를 보여줍니다. –

+0

그러나 문제는 단추 클릭 이벤트 처리 메서드가 일시적으로 완료된다는 것입니다. 반환 된, 여분의 스레드의 스핀 업 동안 첫 번째 밀리 초에서 일어난이 가능성이 작업을 실행하는 스레드의 호출 스택 단추 이벤트 처리기를 표시하지 않을뿐만 아니라 찾고있는 메서드를 가장 가능성이 있음을 의미합니다 이미 반환되었습니다. –

답변

2

여기에 몇 가지 유의할 점이 있습니다. 에 대한 메시지 펌프를 실행하고 그 안에 작업을 실행

  • 스레드를 버튼이있는 창을 소유

    1. 주요 스레드 : 모든

      첫째, 당신은 연극에서 2 개 스레드를

    한 스레드 안에있는 호출 스택은 현재 스레드를 생성 한 스레드가 현재 수행중인 작업을 반영하지 않습니다.

    디버거에서 모든 스레드와 해당 콜 스택을 표시 할 수있는 디버거 창을 검사하면 많아야 2 개의 스레드와 해당 호출 스택이 표시됩니다.

    그러나이 메서드를 실행 한 스레드가 디버거가 중단 점을 맞았을 때 메서드에 남아있는 경우에만 단추 이벤트 핸들러가 표시됩니다. 이것은 새로운 스레드를 돌리는 오버 헤드로 인해 사실이 아닐 가능성이 큽니다.

    그 이유는 async/await반환 async 방법에서를 그것이 await 안타. 별도의 스레드가 대리자를 실행하기 시작하면 버튼 이벤트 핸들러 메서드가 반환되었을 가능성이 큽니다.

    대리인의 스레드를 수동으로 스핀 업하고 해당 스레드에 가입 (대기) 한 경우에도 호출 대기에는 표시되지 않지만 다른 디버거 창에서는 스레드 및 그들의 콜 스택.

  • +0

    오 예. 내 잘못이야. 고맙습니다. –