我有一個由兩個函數調用分隔的代碼中的關鍵部分,如Start()
和End()
。他們在執行期間使用Monitor
來阻止其他線程。現在我的問題是,如果某個線程無論出於何種原因都不會撥打End()
,我的整個過程都會遇到麻煩,因爲每個線程都在等待這個Monitor
的發佈。從監視器的所有者的另一個線程釋放鎖
當然我可以使用TryEnter
超時,這樣我就不會永久等待,但是這不會釋放被阻止的Monitor
,所以我的程序每次都會從這個時間開始進入這個超時。
如果給定的超時結束,是否有辦法從另一個線程釋放阻塞Monitor
?
void Start(){ Monitor.Enter(obj); }
void End(){ Monitor.Exit(obj); }
編輯: 我們通過COM調用Excel互操作,我們不能確保預期Excel進程將一直工作。請注意,這是一個Web應用程序,因此未能處理這種情況是致命的。 Start()
稱爲第一次,請求調用excel函數,End()
在請求結束時調用。 excel過程總是有可能開始掛起。
EDIT2: 我現在HDA的想法耳鼻喉科鎖的所有者存儲在變量和僵局,我可以殺了這個線程。這不會釋放鎖嗎?
if (Monitor.TryEnter(excelLocker, 10000) == false)
{
excelOwner.Abort();
excelOwner = null;
}
else
{
excelOwner = Thread.CurrentThread;
}
爲什麼不在你的方法中設置一些簡單的(...),直到達到某個閾值,然後在那一刻爆發? – 2011-02-03 17:17:32
不要試圖修補代碼中的錯誤。修復錯誤。 – 2011-02-03 17:24:53
@Hans Passant:這不是爲了解決*我們的錯誤。我們通過com interop調用Excel,但我們無法確定Excel過程將始終按預期工作。請注意,這是一個Web應用程序,因此未能處理這種情況是致命的。 – codymanix 2011-02-03 17:35:26