我在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 …Run Code Online (Sandbox Code Playgroud) Method1和Method2是公共方法.这两种方法都需要以相同的顺序接受两个锁.我确定以相同的顺序获取锁定不会导致死锁.锁是Common()不必要的?
public void Method1()
{
lock(LockObjA)
lock(LockObjB)
{
//DoSomething
Common();
}
}
public void Method2()
{
lock(LockObjA)
lock(LockObjB)
{
//DoSomething else
Common();
}
}
private void Common()
{
lock(LockObjA)
lock(LockObjB)
{
//DoSomething else
}
}
Run Code Online (Sandbox Code Playgroud)