如何在运行后台任务的情况下优雅地关闭WPF应用程序?

时间:2012-12-21 17:33:43

标签: .net wpf c#-4.0

我有一个WPF应用程序,我希望可以在启动时分离两个数据研究后台任务。这些后台任务将打开,解析和关闭文件,然后更新SqlServer数据库中的数据。这些任务都不需要向显示线程返回任何内容。这些后台任务不必运行完成,但我需要避免文件打开或Sql Server处于意外状态。用户可以在任务开始后的任何时间关闭应用程序。我正在使用System.Threading.Tasks命名空间中的资源。举个例子:

var IncorporateTask = Task.Factory.StartNew(CommentIncorporateTask);
var incorporateTaskDone = IncorporateTask.ContinueWith((antecedent) => IncorporateTaskFinalize(), TaskScheduler.FromCurrentSynchronizationContext());

我是否需要采取任何措施来确保干净地关闭这些线程,并且不会延迟用户关闭应用程序的经验?

1 个答案:

答案 0 :(得分:1)

您无需担心线程被彻底终止。您需要担心定义后台工作的事务边界,并确保流程不会在这些边界内终止。

我建议你将CancellationToken传递给后台任务。当用户请求退出进程时,您应该:

  1. Cancel令牌来源。
  2. 关于后台任务的
  3. Wait。你可以通过使用异步延续来做更好的事情(例如,禁用所有UI并显示动画,直到后台任务终止)。
  4. 后台任务的责任是在相关时检查取消令牌,如果令牌被取消则提前终止,并且这样做不会让您处于不良状态。这基本上使后台任务负责何时终止,但允许UI尽早请求终止。