我遇到了C#中的多線程問題。 我使用事件從另一個線程更新表單中的標籤,我當然需要使用Invoke()命令。 這部分也工作正常。 但是,用戶可以關閉表單,如果事件在不幸的時間發送,程序可能會崩潰。因此,我認爲我會重寫窗體的Dispose()方法,在鎖定的代碼中將布爾值設置爲true,並檢查該布爾值並在鎖定的代碼中調用該事件。只有一個鎖定對象的'死鎖'?
但是,每次我關閉窗體程序完全凍結。
這裏是代碼中提到的部分:
private object dispose_lock = new object();
private bool _disposed = false;
private void update(object sender, EventArgs e)
{
if (InvokeRequired)
{
EventHandler handler = new EventHandler(update);
lock (dispose_lock)
{
if (_disposed) return;
Invoke(handler); // this is where it crashes without using the lock
}
return;
}
label.Text = "blah";
}
protected override void Dispose(bool disposing)
{
eventfullObject.OnUpdate -= update;
lock (dispose_lock) // this is where it seems to freeze
{
_disposed = true; // this is never called
}
base.Dispose(disposing);
}
我希望在這裏任何人有任何的想法有什麼不對這個代碼。 提前謝謝!
可在實際應用中的更新調用導致窗口處置?在這種情況下,後臺線程可能會有一個鎖,並且UI線程可能會在Dispose鎖定在後臺線程所持的相同對象上。 – 2012-01-28 14:39:39
你從哪裏得到變量InvokeRequired,它應該在你想要更新的控件上調用,即:if(label.InvokeRequired){//} – Lloyd 2012-01-28 15:01:44