C# 如何知道线程是否在等待队列上

C# 如何知道线程是否在等待队列上,c#,windows,multithreading,debugging,windbg,C#,Windows,Multithreading,Debugging,Windbg,如果您没有源代码,那么除了查看其调用堆栈(k或!sosex.mk或!clrstack或!eestack)之外,是否有其他方法可以判断线程当前在等待队列中等待发生什么事情,比如等待从I/O完成端口接收I/O中断或通知 或者可能只是一个睡眠线程,除了一个仍然在等待队列中的线程之外,没有等待任何东西 为了测试,我制作了一个小的C#程序,其中我让线程休眠20秒 main() { Thread.Sleep(20000); } 而我将Windbg连接到其进程。并检查其线程状态,休眠线程报告的线程状态为

如果您没有源代码,那么除了查看其调用堆栈(
k
!sosex.mk
!clrstack
!eestack
)之外,是否有其他方法可以判断线程当前在等待队列中等待发生什么事情,比如等待从I/O完成端口接收I/O中断或通知

或者可能只是一个睡眠线程,除了一个仍然在等待队列中的线程之外,没有等待任何东西

为了测试,我制作了一个小的C#程序,其中我让线程休眠20秒

main()
{
  Thread.Sleep(20000);
}
而我将Windbg连接到其进程。并检查其线程状态,休眠线程报告的线程状态为
0x202a020

00:00> !threadstate 202a020
Legal to Join
CoInitialized
In Multi Threaded Apartment
Fully initialized
Interruptible
我了解每种国旗,但我不太清楚最后一种,即可中断。我的猜测是,interruptable标志只是表示线程可能被任何内核级中断中断,但不一定表示它在等待队列中。即使是运行状态的线程也可能被中断,对吗


那么,有没有一种万无一失的方法可以知道线程当前是否在等待队列中?或者即使它在就绪队列中但尚未运行?

检查
thread.ThreadState
怎么样?在您的情况下,它将处于
WaitSleepJoin
状态。谢谢。我忘了加上“如果你没有源代码,从外部。”我只是更新一下问题。@Evk事实上,这是个好主意。如果我能得到它的线程类(托管)对象,我就可以读取它的
!mdt
!执行
。让我试一试。我得到了方法表地址,然后是主线程对象的
get_ThreadState()
属性访问器的方法描述,但它不允许我执行
调用System.Threading.thread.CurrentThread.ThreadState
调用System.Threading.thread.CurrentThread.get_ThreadState()
。如果我知道某个方法的IL地址或本机代码,您知道如何调用该方法吗?您只能在实时调试中调用该方法。它对崩溃转储不起作用。