假设我在异步套接字上收到了一些信息(因此退出了一些后台线程),这会不断更新表单。我如何安全地更新表单内容,以避免在关闭表单时有时抛出的ObjectDisposedException?
在更新操作中(在后台线程上执行)我检查表单的属性IsDisposed,但这是没用的,因为UI线程有时在检查之后和更新操作之前立即处理表单导致抛出异常(当我关闭表格时) 我试图在表单的“onScreenFormClosed”处理程序和更新操作上对表单对象使用锁,以确保不会同时执行这些操作,但这会阻止UI线程。
我甚至尝试在UI线程上运行更新操作,但是没有用,因为在窗体上调用Invoke(...)仍然抛出了ObjectDisposedException。
答案 0 :(得分:0)
你能改变生成后台线程的类吗?我让他们在表单上注意相应的事件,并检查表单是否在更新信息的开头关闭。
C#使用事件和委托来实现观察者和可观察的模式,但是,只有那些仍在观察的表格才会被更新,这并不重要。
答案 1 :(得分:0)
我通过执行以下操作来处理此问题:
在UI表单的OnClose事件中,我向后台线程发送了“我们正在退出”命令,因此他们将停止操作,然后暂停UI线程一小段时间以允许后台线程关闭,它的工作原理很适合我,但可能不适用于所有情况。