C# 在应用程序退出时创建单独的线程

C# 在应用程序退出时创建单独的线程,c#,C#,是否可以在应用程序退出时创建一个单独的线程,该线程将继续运行(在应用程序关闭后),直到线程完成其工作 我使用的是C#,我有一个例子,我想退出一个应用程序,但同时启动数据库交互,这将触发存储过程。我的问题是,我可以执行不同数量的存储过程,但我不想导致应用程序挂起或退出速度慢。什么是“应用程序退出”?根据定义,当应用程序真正退出时,其所有线程也会退出 也许你想在UI关闭时启动一个新线程?因此,用户认为应用程序已退出,因为没有可见的UI,而应用程序仍在后台运行?是的,这是可能的,但是您需要告诉我们您正

是否可以在应用程序退出时创建一个单独的线程,该线程将继续运行(在应用程序关闭后),直到线程完成其工作

我使用的是C#,我有一个例子,我想退出一个应用程序,但同时启动数据库交互,这将触发存储过程。我的问题是,我可以执行不同数量的存储过程,但我不想导致应用程序挂起或退出速度慢。

什么是“应用程序退出”?根据定义,当应用程序真正退出时,其所有线程也会退出


也许你想在UI关闭时启动一个新线程?因此,用户认为应用程序已退出,因为没有可见的UI,而应用程序仍在后台运行?是的,这是可能的,但是您需要告诉我们您正在使用哪个UI框架。(WinForms?WPF?

我不希望应用程序在关闭时继续以不可见的方式运行。当我关闭某个进程并挂起该进程时,或者如果我关闭应用程序以释放资源时,这尤其令人讨厌

为了礼貌地对待您的用户,您应该在退出时提供某种可最小化的任务栏可见窗口,告知他们正在发生什么以及状态是什么。这不需要另一个线程-您可以从退出代码中执行

  • 你的数据库支持工作吗?然后,您需要做的就是在应用程序完成时设置数据库作业

  • 如果你需要从你的程序到数据库的某种交互,那么你可以考虑在用户关闭程序并进行需要做的数据库调用时让你的应用程序不可见。
    再次给出另一个答案:据我所知,这是一个Windows窗体应用程序,如果您想在关闭应用程序之前完成某项工作,您可以侦听主窗体的
    关闭
    事件

    顺便说一句,不能继续,就像@Vlad所说的那样,创建的任何线程都将被销毁,因为它是被销毁的应用程序的一部分。所以,只有在退出应用程序后(如果你真的需要它,但现在我不这么认为),才能阻止你的主线程,等待其他线程,然后完成

    另一个建议,让应用程序立即关闭的用户“填充”,可能是让表单不可见,继续做“脏”的事情:)但这种技巧非常依赖于应用程序,我很难就这个问题给你们正确的建议


    正如其他人所提到的,当程序关闭时,所有线程都会终止。你想按照你在对弗拉德回答的评论中提到的去做。不过,你必须小心你在哪里工作。如果您在
    Application.ApplicationExit
    事件中执行此操作,您的表单将全部被释放,您将无法访问任何数据/类。您需要将代码放在主窗体的
    FormClosing
    事件中。如果调用
    this.Hide()
    ,表单将消失。在那里执行您的数据库工作。一旦该方法退出,程序将正常终止。

    无论项目类型是WinForm/WPF/etc,您都可以找到

    static void Main(params object[] args) { ... }
    

    在你的项目中的某个地方。它可能是Program.cs或Application.cs,具体取决于项目的类型。在这种情况下,将有一个调用打开应用程序的UI,这是一个阻塞调用。在用户界面退出、关闭窗口等之后,您在主界面中输入的任何内容都将被执行。

    您在谈论什么技术?Windows窗体、WPF、控制台。。。哪一个?虽然不是一个确切的答案,但我可以告诉你这肯定是可能的,因为在很多情况下,当你不想要它的时候,你就有了它。流行的应用程序在崩溃时也会出现这种情况。你可以启动第二个进程,比如一个控制台应用程序来完成额外的工作,但这似乎是一个糟糕的设计。如果您的应用程序正在工作,它应该提前向用户说明,并显示某种进度窗口,显示最终工作的状态,然后退出。我正在使用WinForms,是的,我指的是应用程序真正退出的时间,以及进程终止的时间。尽管这确实提出了一个好问题。关闭UI并且进程在后台运行直到完成似乎合理吗?在这种情况下,不可能。应用程序线程是应用程序的一部分,因此如果应用程序退出,所有线程都将终止。或者,让我们换一种说法:如果任何应用程序线程处于活动状态,那么根据定义,应用程序不会退出。关闭UI并在后台运行进程是实现您在问题中描述的目标的合理方式。弗拉德,我唯一的问题是在应用程序启动时,我检查它是否已经运行。因此,如果用户意外关闭应用程序并立即重新打开,他们可能会收到一条消息,说由于我的线程一直执行到完成,应用程序仍在运行。是的,这是真的。但如果应用程序的第二个实例可以自由启动,并且在不一致的状态下使用数据库,则情况会更糟。然而,当用户关闭程序时,我不会完全关闭UI,而是在整个数据库更新过程中显示一个小的无边框窗口,上面写着“正在完成数据库,请稍候…”。Tigran,在进一步思考之后,我意识到了这一点。然而,我必须保持这样的心态,我的用户将是白痴。因此,我不想在我的主应用程序退出后留下任何打开/运行的内容,因为我不希望他们在我完成“肮脏的工作”之前试图重新打开应用程序会产生任何负面影响。实际上,我只是想进一步讨论,因为此时我正在阻止编写者