我在C#中遇到多线程问题.
我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用Invoke()命令.
那部分也很好.
但是,用户可以关闭表单,如果在不幸的时间发送事件,程序可能会崩溃.
我使用一个事件来更新另一个线程的表单中的标签,当然我需要使用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. }
它更简单,更直接.如果注释指定了捕获异常的原因,我认为没关系.