从后台线程不断更新表单

时间:2011-03-23 08:59:37

标签: c# winforms

假设我在异步套接字上收到了一些信息(因此退出了一些后台线程),这会不断更新表单。我如何安全地更新表单内容,以避免在关闭表单时有时抛出的ObjectDisposedException?

在更新操作中(在后台线程上执行)我检查表单的属性IsDisposed,但这是没用的,因为UI线程有时在检查之后和更新操作之前立即处理表单导致抛出异常(当我关闭表格时) 我试图在表单的“onScreenFormClosed”处理程序和更新操作上对表单对象使用锁,以确保不会同时执行这些操作,但这会阻止UI线程。

我甚至尝试在UI线程上运行更新操作,但是没有用,因为在窗体上调用Invoke(...)仍然抛出了ObjectDisposedException。

2 个答案:

答案 0 :(得分:0)

你能改变生成后台线程的类吗?我让他们在表单上注意相应的事件,并检查表单是否在更新信息的开头关闭。

C#使用事件和委托来实现观察者和可观察的模式,但是,只有那些仍在观察的表格才会被更新,这并不重要。

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/11b46013-089b-44ca-907a-6dab05c5b454/

答案 1 :(得分:0)

我通过执行以下操作来处理此问题:

在UI表单的OnClose事件中,我向后台线程发送了“我们正在退出”命令,因此他们将停止操作,然后暂停UI线程一小段时间以允许后台线程关闭,它的工作原理很适合我,但可能不适用于所有情况。