使用Monitor.Enter和Monitor.Exit時,我似乎遇到併發問題。有時候,我的代碼掛在下面的Monitor.Exit聲明:Monitor.Exit()有時會掛起
public void EndInit()
{
Monitor.Enter(this.lockObj);
this.initCount--;
if (this.initCount == 0) {
this.IsInitializing = false;
this.IsInitialized = true;
this.OnInitialized();
}
// sometimes, this Exit will never return ...
Monitor.Exit(this.lockObj);
}
這裏只有一個其他地方,在那裏我lockObj用於:
public void BeginInit()
{
Monitor.Enter(this.lockObj);
this.initCount++;
this.IsInitializing = true;
this.IsInitialized = false;
Monitor.Exit(this.lockObj);
}
這就是我如何聲明此同步對象:
private readonly object lockObj = new object();
我正在撕掉我的頭髮,發現它在這裏發生了什麼,但沒有成功。我期望Monitor.Enter()
阻止,直到我的同步對象被釋放,但爲什麼Monitor.Exit()
被阻止?我無法在MSDN中找到有關此行爲的任何解釋。
注意我不能重現這種行爲,它發生的很隨機(嗯,我知道「隨機」不是正確的措辭)。
任何想法或有用的提示,高度讚賞!
Thorsten
如果可能,您可以用'lock(){}'塊代替'Monitor.Enter' /'Monitor.Exit'組合。如果在Monitor.Exit調用之前拋出異常會發生什麼? – Dbuggy