关闭Windows Forms应用程序后为什么出现错误?
当我通过单击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已关闭)。
在此处向下滚动到"前台和后台线程"以获取更多信息