【问题标题】:Wait for Tasks to complete at shutdown without deadlocking等待任务在关机时完成而不会死锁
【发布时间】:2017-04-21 13:57:56
【问题描述】:

在任何给定时间,我的 WPF 应用程序都有一堆异步 Tasks 在后台线程/同步上下文中运行。在关机时,我需要设置一个CancellationToken,然后等待这些任务正常完成,然后才能开始拆除它们所依赖的本机库。但是有些任务有(需要)在主线程上运行的延续,所以从同一个线程调用Task.WaitAll(_myTasks) 会死锁。我想做的是这样的:

while(!AreAllTasksComplete(_myTasks))
   LetContinuationsThatAreWaitingForThisContextRun();
TearDownTheNativeLibraries();

当然 LetContinuationsThatAreWaitingForThisContextRun() 是不存在的。有什么办法可以做我想做的事吗?我需要完全不同的方法吗?

【问题讨论】:

  • 在你的主线程可以返回消息循环的同时监视你的任务的另一个后台线程呢?也许有什么可以等待的......
  • 有一段时间我不得不做很多任务,但你可能想看看 Task.WhenAll。这个问题详细解释了它的用途。stackoverflow.com/questions/22699048/…
  • 由于这是一个 WPF 应用程序,事实证明我可以像这样实现LetContinuationsThatAreWaitingForThisContextRun()Dispatcher.CurrentDispatcher.Invoke(() => { }, DispatcherProperity.Background)。这有效(表面上),但它依赖于可能是未记录的行为。

标签: c# wpf asynchronous async-await task


【解决方案1】:

你可以的

await Task.WhenAll(_myTasks);
TearDownTheNativeLibraries();

【讨论】:

  • 这样的事情是我的第一个想法,但我需要一种方法来防止应用程序退出,直到 TearDownTheNativeLibraries() 继续运行之后。否则,在我等待期间,shudown 过程将继续,应用程序将退出,并且 TearDownTheNativeLibraries() 将永远不会发生,结果它们管理的文件可能会处于不一致的状态。我可能最终会做这样的事情,但这需要一些重构。
  • 这取决于 (a) 触发关机的事件(例如单击按钮)和 (b) 您如何命令系统终止您(例如在主窗口上调用 Close())。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2023-04-04
  • 1970-01-01
  • 2015-11-16
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多