2

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

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

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

4

1 回答 1

2

您无需担心线程会被干净地终止。您确实需要担心定义后台工作的事务边界并确保进程不会在这些边界内终止。

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

  1. 取消令牌来源。
  2. 等待后台任务。您可以通过使用异步延续来做一些更有趣的事情(例如,禁用所有 UI 并显示动画,直到后台任务终止)

然后后台任务负责在相关时检查取消令牌,并在令牌被取消时提前终止,并且这样做不会让您处于不良状态。这实质上是让后台任务负责何时可能发生终止,但允许 UI 尽可能早地请求终止。

于 2012-12-22T13:55:38.810 回答