我最近为一些本科生设置了一些课程,他们必须使用一个相对简单的小型C#库。这个库的主要目的是显示一个简单的表单,它由一个彩色网格(他们可以操作),一些按钮和带有一些文本的标签组成。
它们扩展的类提供了许多必须实现的抽象方法,其中一个方法称为UpdateAction,并以设定的间隔自动调用。
我自己没有遇到过以下问题,但在实验室中,有些学生遇到了一个间歇性的InvalidOperationException,当他们关闭表单时会从他们的UpdateAction方法中抛出。错误消息是我尝试从不同的线程尝试修改UI时通常会看到的错误,但只有一个双引号''
,您通常会看到有问题的控件的名称。 />
如果这仍然是个问题,我们需要向他们重新发布一个固定版本的库,尽管我们已经声明这个错误不会以任何方式影响他们的工作标记(因为它似乎是我们代码中的一个缺陷)
据我所知,学生必须关闭表格,以便更新正在运行并且他们正在修改的控件在更新线程停止之前被处理掉,即看起来控件已经变为空。奇怪的是它是多么断断续续,一些学生从来没有遇到过这个问题,有些学生却一直没有这个问题。在开发课程模型解决方案或开发库本身时,我从未亲自遇到过它。
所以我的问题是在表单生命周期中的哪个点上它的控件被处理掉了,因此最好放置停止更新线程的代码?目前这个代码采用Dispose方法的形式,是否可以更好地放在其他地方?
答案 0 :(得分:1)
你是如何阻止线程的?在关闭窗户之前,你确定它已经停止了吗?您应该确保通过在线程循环中设置标志来停止它。然后,您必须等待线程退出。
主题
while (running)
{
// thread stuff
}
表格
thread.running = false; // or use your own Stop() method that does the same thing
thread.Join();
如果您需要响应系统,则需要确保线程能够在获得停止信号的短时间内退出。