【问题标题】:How to cancel blocked task in WPF如何在 WPF 中取消被阻止的任务
【发布时间】:2019-11-20 11:46:55
【问题描述】:

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

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

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

【问题讨论】:

  • 你不能取消一个不支持被取消的操作,但是你可以忽略它产生的任何返回值,然后在你的另一个线程中继续。
  • Task.Run(() => YourLongRunningFunction).Wait(2000);在函数内部创建一个条件来检查 False 或 true 的属性以取消任务
  • 你有一个新任务。这会进行一些长时间的操作。它还阻止了其他一些任务。我不清楚后一个任务是什么。你需要你的长任务来阻止你所说的其他任务吗?
  • @mm8 我取消任务只是因为硬件以意外方式运行,取消任务后我仍然需要重新启动相同的作业。如果我忽略它,它会导致程序中的多个无用线程并有趣地卡住计算机吗?
  • @ErwinDraconis 检查一个属性需要一个while/for循环,对吧?但是程序没有循环来执行作业

标签: c# wpf multithreading


【解决方案1】:

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

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

在寻找更多信息时发现了这个(剧透,除了上述推荐的编码实践/安全之外,你不能做任何事情):How do I abort/cancel TPL Tasks?

【讨论】:

  • 是的,我考虑过超时和取消令牌。因为工作需要很长时间才能完成超时会非常大。这意味着我必须等待很长时间。另一方面,取消令牌需要在程序中使用 while/for 循环来检查 IsCancellationRequested,但程序不需要循环来执行作业。
猜你喜欢
  • 1970-01-01
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多