代码之家  ›  专栏  ›  技术社区  ›  RobV

在Windows窗体关闭过程中,控件在什么时候失效?

  •  0
  • RobV  · 技术社区  · 16 年前

    我最近为一些本科生设置了一些课程,他们必须使用提供给他们的一个相对简单的小型C#库。该库的主要目的是显示一个简单的表单,该表单由一个彩色网格(它们可以操纵)、多个按钮和带有一些文本的标签组成。

    它们扩展的类提供了许多必须实现的抽象方法,其中一个称为UpdateAction,并以设定的间隔自动调用。

    我自己没有遇到过以下问题,但在实验室中,一些学生在关闭表单时遇到了UpdateAction方法中抛出的间歇性InvalidOperationException。当您尝试从不同的线程修改UI时,我通常会看到错误消息,但只有一个双引号 '' 您通常会看到违规控件的名称。
    如果这仍然是一个问题,我们将需要向他们重新发布库的固定版本,尽管我们已经声明此错误不会以任何方式影响他们的工作标记(因为它似乎是我们代码中的一个缺陷)。

    据我所知,学生必须在更新正在运行并且他们正在修改的控件在更新线程停止之前被处理掉的时候关闭表单,即控件似乎已变为null。奇怪的是,它是如此的断断续续,一些学生从未有过这个问题,而另一些学生却一直有这个问题。在我为课程开发模型解决方案的整个过程中,或者在开发图书馆本身的过程中,我从未亲自遇到过它。

    所以我的问题是,在表单生命周期中,控件是在什么时候被处理掉的,因此,最好将停止更新线程的代码放在哪里?当前此代码位于forms Dispose方法中,是否将其放置在其他位置更好?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Matt Breckon    16 年前

    你怎么停止线程?在你关上窗户之前,你确定它停了吗?您应该通过在线程循环中设置标志来确保停止它。然后必须等待线程退出。

    while (running)
    {
        // thread stuff
    }
    

    形式

    thread.running = false; // or use your own Stop() method that does the same thing
    thread.Join();
    

    如果您想要一个响应系统,您需要确保线程能够在获得停止信号的短时间内退出。