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. } 它更简单,更直接.如果注释指定了捕获异常的原因,我认为没关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |