Thread.Sleep(0)的用途

Thread.Sleep(0) 并非是真的要线程挂起0毫秒,意义在于这次调用Thread.Sleep(0)的当前线程确实的被冻结了一下,让其他线程有机会优先执行。 Thread.Sleep(0) 是你的线程暂时放弃cpu,也就是释放一些未用的时间片给其他线程或进程使用,就相当于一个让位动作。

这个代码可以比较经典的解释Thread.Sleep(0)的用途。代码如下:

Hashtable inMemoryCache;
CacheItem cacheItemBeforeLock = null;
// ..... 一些其他代码
// 通过循环,以获得 cacheItemBeforeLock 的控制权。

bool lockWasSuccessful;
do
{
lock (inMemoryCache.SyncRoot)
{
// .....
lockWasSuccessful = Monitor.TryEnter(cacheItemBeforeLock);
}
if (lockWasSuccessful == false)
{
Thread.Sleep(0);
}
} while (lockWasSuccessful == false);

try
{
// 对 cacheItemBeforeLock 作一些操作
// .....
}
finally
{
Monitor.Exit(cacheItemBeforeLock);
}
 
Thread.Sleep(0); 线程挂起0毫秒。表面看来这个代码是没啥意义的。
其实不然,挂起0毫秒的意义不在于0毫秒,而在于挂起2个字,线程挂起,其他线程就有机会优先执行。
上面的代码中,在Thread.Sleep(0);之前,这个线程跟其他线程争抢cacheItemBeforeLock的情况,就会因为这个挂起而得到解决。
neptune -
共有0个回答