我很好奇Thread.Sleep
是如何实施的。我看了一下Reflector来实现Thread.Sleep
。它调用以下函数:
[MethodImpl(MethodImplOptions.InternalCall), SecurityCritical]
private static extern void SleepInternal(int millisecondsTimeout);
有谁知道定义的位置?我知道其他替代方案,例如Task.Delay。但对实际的实施细节感到好奇。
答案 0 :(得分:3)
Joe Duffy的书“Concurrent Programming”提供了您需要的所有细节。但总结一下:
Thread.Sleep
的行为类似于Win API函数SleepEx。Thread.Interrupt
次来电。我建议通过SSCLI代码来更全面地了解它的实现方式。
关于你无法将线程重用于其他工作的问题......我有点困惑。 Thread.Sleep
是一个自愿暂停,所以你(程序员)告诉线程不再做任何工作。就像我上面提到的那样,线程被认为是可警告的,所以你可以实际打断它,甚至强迫它通过APC方法工作。
有关在Thread.Sleep
仍处于待处理状态时让.NET线程运行APC的详细信息,请参阅此question。
答案 1 :(得分:1)
Thread.Sleep()
是一个挂钩到OS内核调度内部的调用,类似于进程休眠。它将执行上下文(在内核进程级别可见)置于“休眠”等待状态,因此在唤醒之前它不会消耗CPU。这不是一个忙碌的等待。
如果您希望它清醒和/或做其他事情,请使用除Thread.Sleep()
之外的其他一些机制。
答案 2 :(得分:0)
如果您希望重复使用该线程,请使用await Task.Delay()