今天在看 EnterpriseLibrary 源文件时,看到如下的代码,这个代码可以比较经典的解释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的情况,就会因为这个挂起而得到解决。
参考:
关于Thread.Sleep(0)
http://www.cnblogs.com/zzgfly/archive/2007/07/15/818426.html
Thread.Sleep 方法 (Int32)
http://msdn.microsoft.com/zh-cn/library/d00bd51t(VS.80).aspx