单击F5(调试模式)运行Visual Studio Windows窗体应用程序后,单击关闭按钮(调用Application.Exit()
)后几秒钟
我收到一条错误消息:
无法访问已处置的对象:对象名称'SampleForm'。
有点背景知识,我有另一个每x秒运行一次的线程。
我的猜测是,当我关闭应用程序时,由于它仍处于调试模式,另一个线程仍在运行,它试图访问某些东西 但是自从我关闭申请表后,表格就会被处理掉。
这是对的吗?
在拨打Application.Exit()
之前,我是否必须杀死后台进程线程?
更新
现在,当我在调用thread.Abort()
之前调用Application.Exit()
时,应用程序完全关闭。以前,在我点击关闭按钮之后,调试器仍然在运行(即没有选择停止按钮)所以它一定是因为线程仍处于活动状态。
答案 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区域,看看它们是否处理任何类型的线程生命周期管理。