关闭Windows窗体应用程序后,为什么会出现错误?

时间:2008-10-02 15:21:21

标签: winforms multithreading debugging

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

  

无法访问已处置的对象:对象名称'SampleForm'。

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

我的猜测是,当我关闭应用程序时,由于它仍处于调试模式,另一个线程仍在运行,它试图访问某些东西 但是自从我关闭申请表后,表格就会被处理掉。

这是对的吗?

在拨打Application.Exit()之前,我是否必须杀死后台进程线程?

更新

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

6 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我认为调试与发布模式是一个红色的鲱鱼。在发布模式下,您只是没有获得“无法访问已处置对象”错误的对话框。

答案 2 :(得分:1)

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

向下滚动到前景和后台主题here以获取更多信息

答案 3 :(得分:0)

是的,你需要先杀死线程。

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

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

do {

    // Crazy threading stuff here

}while(_running);

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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