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

标签 .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());

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

最佳答案

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

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

  1. Cancel token 来源。
  2. Wait关于后台任务。您可以通过使用异步延续来做一些更奇特的事情(例如,禁用所有 UI 并显示动画,直到后台任务终止)

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

关于.net - 如何在后台任务运行的情况下优雅地关闭WPF应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13994640/

相关文章:

c# - DataTable.Rows 方法不返回 IEnumerable<DataRow>

c# - 如何在前瞻中匹配字符串的结尾?

C#访问器和初始化

c# - 如何从 WPF 应用程序方法运行 Windows 服务应用程序

wpf - 样式化 GridSplitter wpf C#

android - FreeSwitch 使用 API 创建分机/SIP 用户

c# - WPF 如何使边框宽度扩展以填充 DockPanel 中的可用空间

asp.net-mvc - SaveChanges() 不保存数据

asp.net-mvc-3 - MVC3 Razor - 绑定(bind)到 View 模型的 TextBoxFor() 值在从 Post 返回后未正确更新

c#-4.0 - 尝试装饰设计模式,这段代码有什么问题?