首页 > 解决方案 > 如何在 WPF 中取消被阻止的任务

问题描述

我使用 WPF 创建一个窗口,同时创建一个新任务来实现时间成本作业,这也会在完成之前阻止任务。

现在我想使用一个按钮,尽管它仍然处于活动状态,但它可以取消并退出被阻止的任务。微软文档建议使用CancellationToken取消任务,但问题是我无法检查IsCancellationRequested标志是否被触发,因为被阻止的任务没有循环检测标志,无法正常退出任务。我也尝试使用Thread.Abort()强制关闭线程,但它会导致 PlatformNotSupportedException.

所以我想知道是否有任何方法可以取消被阻止的任务/线程及其子任务/线程,或者 WPF 是否提供了任何方法来关闭除主 UI 线程之外的所有任务/线程。

标签: c#wpfmultithreading

解决方案


您可以在任何等待任务的地方取消,从而防止它阻塞任何东西。这可以使用Task.Wait重载来完成,该重载采用超时、取消令牌或两者兼有。

如果您想以某种方式取消您扔到以太中的任务,那么唯一的方法是在您构造它时将取消令牌传递给它,然后在您的方法中的各个点使用 ThrowIfCancellationRequested 或 IsCancellationRequested 进行检查在任务中调用。

在寻找更多信息时发现了这一点(剧透,除了上述推荐的编码实践/安全之外,您不能做任何事情):如何中止/取消 TPL 任务?


推荐阅读