【问题标题】:Continously updating a form from a background thread从后台线程不断更新表单
【发布时间】:2011-03-26 05:01:02
【问题描述】:

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

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

我什至尝试在 UI 线程上运行更新操作,但它没有用,因为在表单上调用 Invoke(...) 仍然抛出 ObjectDisposedException 。

【问题讨论】:

标签: c# winforms


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我通过以下方式处理了这个问题:

    在 UI 窗体的 OnClose 事件中,我向后台线程发送了“我们正在退出”命令,以便它们停止操作,然后将 UI 线程休眠一小段时间以允许后台线程关闭,它可以工作对我来说很好,但可能不适用于所有情况。

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 2013-11-23
      • 2018-05-24
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多