是否可以在应用程序退出时创建一个单独的线程,该线程将继续运行(在应用程序关闭后),直到线程完成其工作?
我正在使用C#,我有一个案例,我想退出一个应用程序但同时启动数据库交互,这将触发存储过程。我的问题是我可以执行可变数量的存储过程,但我不想让应用程序挂起或退出缓慢。
答案 0 :(得分:1)
“申请退出”是什么意思?根据定义,当应用程序真正退出时,它的所有线程也会退出。
也许您想在UI关闭时启动新线程?这样用户认为该应用程序已退出,因为没有可见的UI,而应用程序仍然在后台运行?是的,这是可能的,但您需要告诉我们您正在使用哪个UI框架。 (WinForms?WPF?)
答案 1 :(得分:0)
我不希望应用程序在关闭时无形地继续运行。当我关闭并且某些事情挂起,或者我关闭应用程序以释放资源时,这尤其令人讨厌。
为了对您的用户保持礼貌,您应该在退出时拥有某种可最小化的,任务栏可见的窗口,以告知他们发生了什么以及状态如何。这不需要另一个线程 - 您可以从退出代码中执行此操作。
答案 2 :(得分:0)
您是否支持数据库工作?然后,您需要做的就是在应用程序完成时设置数据库作业。
如果您需要从程序到数据库进行某种交互,那么您可以考虑在用户关闭程序并执行需要完成的数据库调用时使应用程序不可见。
答案 3 :(得分:0)
另一个答案:据我所知,它是 Windows Form 应用程序,如果你想在关闭应用程序之前完成某些事情,你可以听取主表单的 {{ 1}}事件。
顺便说一句,你不能继续,就像 @Vlad所说,任何创建的线程都会被破坏,因为它会成为销毁的应用程序的一部分。所以除了阻止你的主线程和等待其他线程并且只有在退出应用之后(如果你真的需要它,但是在这一点我不这么认为)并完成。
另一种说法是,向用户“填写”应用程序立即关闭你,可能会使表单隐形并继续做你的“脏”东西:)但这种技巧非常依赖于应用程序,这对我来说很难只是为了给你正确的主题。
问候。
答案 4 :(得分:0)
正如其他人所提到的,当程序关闭时,所有线程都会被终止。你想按照你对弗拉德答案的评论中提到的那样做。但是,你必须要小心你的工作地点。如果您在Application.ApplicationExit
事件中执行此操作,您的表单将全部处理,您将无法访问任何数据/类。您将要将代码放在主窗体的FormClosing
事件中。如果您致电this.Hide()
,表单将会消失。在那里执行数据库工作。一旦该方法退出,程序将正常终止。
答案 5 :(得分:0)
无论项目类型如何,WinForm / WPF /等,你总能找到一个
static void Main(params object[] args) { ... }
项目中的某个地方。它可能是Program.cs或Application.cs,具体取决于项目类型。在此将有一个调用打开您的应用程序的UI,这是一个阻止调用。您放入Main的任何内容都将在您的UI退出,关闭其窗口等后执行。