关闭Windows Forms应用程序后为什么出现错误?

时间:2020-03-06 15:02:00  来源:igfitidea点击:

当我通过单击F5(调试模式)运行Visual Studio Windows Forms应用程序时,在几秒钟后单击关闭按钮(调用Application.Exit())后,
我收到一条错误消息:

cannot acess a disposed object: Object name 'SampleForm'.

有点背景,我有另一个线程每x秒运行一次。

我的猜测是,当我关闭应用程序时,由于它仍处于调试模式,因此另一个线程仍在运行,并且它尝试访问某些内容。
但是由于我关闭了该应用程序,因此该表格已被处置。

这样对吗?

我必须在调用Application.Exit()之前杀死后台进程线程吗?

更新

现在,当我在调用Application.Exit()之前调用thread.Abort()时,应用程序将完全关闭。以前,即使在我单击关闭按钮后,调试器仍在运行(即未选择停止按钮),所以一定是因为线程仍处于活动状态。

解决方案

是的,我们需要先终止线程。

不过,这实际上与调试模式无关。这与基本线程有关。

编辑:根据更新,我们不应该中止线程。线程应该被发信号并自行退出。我不确定线程或者代码是什么样的,但是类似:

do {

    // Crazy threading stuff here

}while(_running);

确保将另一个线程设置为后台线程。

另外,在Application.Exit中,使otherThread.Join()

我认为debug vs. release模式是一个红色的鲱鱼。在发布模式下,我们只是没有看到带有"无法访问已处置的对象"错误的对话框。

将线程标记为BackgroundThread,并在关闭窗口后立即停止运行。

是的,我们绝对需要杀死产生的线程。在这种情况下,我们要检查所访问的UI对象是否已放置,如果已放置,则中止当前线程。另一种可能性就是跟踪线程并在退出时将其杀死。第三种可能性是查看系统ThreadPool和BackgroundWorker区域,以查看它们是否可以处理任何此类的线程生命周期管理。

将线程设置为在后台模式下运行Thread.IsBackground = true。默认为前台模式,这将使其保持活动状态(即使UI已关闭)。

在此处向下滚动到"前台和后台线程"以获取更多信息