當我在我正在等待的方法的主體中設置斷點時,Visual Studio調試器將顯示沒有任何C#編譯器生成的代碼的調用堆棧。爲什麼Visual Studio調試器不顯示由await關鍵字生成的狀態機代碼?
請看下面的圖片,其中顯示了我的簡單async
方法和調用堆棧。
注意,存在對MoveNext
或初始化狀態機對象或所述TaskAwaiter<TResult>
或在調用棧中的AsyncTaskOfTMethodBuilder
沒有呼叫。
這是爲什麼?就像在IL Spy中一樣,Visual Studio中是否有一些設置可以切換到在調試會話進行時顯示調用堆棧和編輯器中的狀態機代碼?
我突然想起在重新編寫的按鈕單擊處理程序代碼上有一個DebuggerStepThroughAttribute
實例化狀態機。但我不確定這是否是調試器隱藏的原因。難道這不應該讓調用堆棧中編譯器生成的方法的堆棧框架變灰嗎?
是不是DebuggerHiddenAttribute
讓代碼對調試器不可見?
你的斷點是在另一個線程上運行的任務中,爲什麼應該有創建該線程的callstack的證據?你有沒有檢查你可以在調試器中獲得的獨立線程窗口?我不記得名字,但是可以打開一個窗口/窗格,顯示程序中所有線程的狀態。 –
然而,問題在於按鈕單擊事件處理程序方法暫時完成。它已經返回,這可能發生在額外線程啓動期間的第一個毫秒內,這意味着運行任務的線程的調用堆棧不會顯示按鈕事件處理程序,您正在尋找的方法最有可能已經返回。 –