c# - 如何在 WPF 中取消被阻止的任务
问题描述
我使用 WPF 创建一个窗口,同时创建一个新任务来实现时间成本作业,这也会在完成之前阻止任务。
现在我想使用一个按钮,尽管它仍然处于活动状态,但它可以取消并退出被阻止的任务。微软文档建议使用CancellationToken
取消任务,但问题是我无法检查IsCancellationRequested
标志是否被触发,因为被阻止的任务没有循环检测标志,无法正常退出任务。我也尝试使用Thread.Abort()
强制关闭线程,但它会导致 PlatformNotSupportedException
.
所以我想知道是否有任何方法可以取消被阻止的任务/线程及其子任务/线程,或者 WPF 是否提供了任何方法来关闭除主 UI 线程之外的所有任务/线程。
解决方案
您可以在任何等待任务的地方取消,从而防止它阻塞任何东西。这可以使用Task.Wait重载来完成,该重载采用超时、取消令牌或两者兼有。
如果您想以某种方式取消您扔到以太中的任务,那么唯一的方法是在您构造它时将取消令牌传递给它,然后在您的方法中的各个点使用 ThrowIfCancellationRequested 或 IsCancellationRequested 进行检查在任务中调用。
在寻找更多信息时发现了这一点(剧透,除了上述推荐的编码实践/安全之外,您不能做任何事情):如何中止/取消 TPL 任务?
推荐阅读
- eclipse - 错误:无法找到或加载主类 CrossBrowserTesting.ChromeTesting
- java - Google AdMob AdView 始终为空白
- ide - 调试时如何使 Locals IDE 窗口始终位于顶部?
- git - Linux 最新稳定编译:不能代表对 vmlinux-gdb.py 的更改:
- javascript - 如何使用 Javascript 拉取 api,对拉取数据进行计算,并将结果发布到网页?
- asp.net-mvc - 未找到框架“.NETFramework,Version=v4.6.1”的参考程序集。尝试使用管道 jenkinsfile 构建时出错
- c - 为什么 unsortedArray 在我的代码运行时会发生变化?
- node.js - 在托管在 S3 上的反应(Web)应用程序中使用类似“aws-sdk”(和 process.env)的安全性如何?
- java - 使用 pdfbox 为文本字段设置工具提示
- c# - 在 C# 中从 Datatable 创建一个深层嵌套对象