我遇到了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