Dot-Net
Monitor.TryEnter(object) 和 Monitor.TryEnter(object, ref bool) 之間存在什麼重要區別?
似乎這些程式碼片段的行為應該相同:
1:Monitor.TryEnter(對象)
if (Monitor.TryEnter(lockObject)) { try { DoSomething(); } finally { Monitor.Exit(lockObject); } }2:Monitor.TryEnter(object, ref bool) - 在 .NET 4.0 中引入
bool lockAcquired; try { Monitor.TryEnter(lockObject, ref lockAcquired); if (lockAcquired) { DoSomething(); } } finally { if (lockAcquired) { Monitor.Exit(lockObject); } }我從 MSDN 文件中看到關於帶
ref bool參數的重載:如果由於拋出異常而沒有獲取鎖,則該方法結束後為lockTaken參數指定的變數為**false 。**這允許程序在所有情況下確定是否需要釋放鎖。
但是文件還指出,僅採用
object參數的重載不會引發除ArgumentNullException. 因此,似乎如果在上面的程式碼片段1中引發了異常,那可能只是因為lockObjectisnull,在這種情況下,無論如何都沒有鎖定(並且TryEnter會返回false),因此Monitor.Exit不需要呼叫。顯然,他們不會無緣無故地引入這種過載。那麼該
Monitor.TryEnter(object, ref bool)方法打算解決什麼場景呢?
- Monitor.TryEnter 可能會成功,然後觸發非同步異常,例如 ThreadAbortException 或 OutOfMemoryException(可能在沒有可見分配的情況下發生)。然後鎖定將被佔用但從未釋放。
請參閱:鎖和異常不能混用