【发布时间】: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