在执行Application.Current.Shutdown时,为什么线程(Task)没有正常退出?

时间:2014-09-02 08:00:42

标签: c# wpf multithreading

所以我正在创建任务并运行它们。 但是我知道,当我正在关机时 - 线程刚刚结束 - 我不知道在哪个州。

当使用“任务”或“BackgroundWorker”时会发生这种情况,如果我使用的是线程 - 那么在我的线程完成之前应用程序就不会结束。

这意味着,我不知道如何正确地进行清理。 我应该在通知线程完成后调用Shutdown吗? - 这有点烦人,因为我希望应用程序尽快“停止所有UI”。

谢谢!

1 个答案:

答案 0 :(得分:1)

您根本不应该使用Application.Current.Shutdown。退出应用程序的正确方法是让用户关闭主窗口。由于许多原因,使用Shutdown是一个坏主意 - 例如,您将失去中止关闭的能力(典型情况是表示"您有未保存的更改")。

编辑

OP明确表示他的应用程序没有主窗口,因此使用Application.Current.Shutdown实际上是合适的。但是,只有在安全完成(或取消)所有关键后台工作后才能调用它。

默认情况下,

TaskBackgroundWorker使用后台线程(实际上是线程池线程),它不会阻止应用程序退出。当进程退出时,所有后台线程只是 die - 没有例外,没有记录,没有完成。不要将后台线程用于关键任务。但请注意,替代方案是线程根本不会退出并且进程将继续运行 - 您必须自己处理所有后台任务的正常关闭。

换句话说,当用户在上下文菜单中按Exit时,取消所有正在运行的后台工作,等待它正确完成,并且只有在所有成功完成后才调用Shutdown