加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – ‘死锁’只有一个被锁定的对象?

发布时间:2020-12-15 08:20:13 所属栏目:百科 来源:网络整理
导读:我在C#中遇到多线程问题. 我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用Invoke()命令. 那部分也很好. 但是,用户可以关闭表单,如果在不幸的时间发送事件,程序可能会崩溃. 所以,我想我会简单地覆盖窗体的Dispose()方法,在锁定代码中将布尔值设
我在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);
}

我希望这里的任何人都知道这段代码有什么问题.
先感谢您!

解决方法

我真的很简单.而不是实现棘手的线程安全代码,我只是捕获异常,如果失败则什么都不做.

假设它是ObjectDisposedException:

try
{
    this.Invoke(Invoke(handler));
}
catch (ObjectDisposedException)
{
    // Won't do anything here as
    // the object is not in the good state (diposed when closed)
    // so we can't invoke.
}

它更简单,更直接.如果注释指定了捕获异常的原因,我认为没关系.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读