【问题标题】:How to cancel Task without CancellationToken.IsCancellationRequested?如何在没有 CancellationToken.IsCancellationRequested 的情况下取消任务?
【发布时间】:2012-09-09 16:31:36
【问题描述】:

我正在使用 C# 4.0 开发一个 WPF 应用程序,其中一些用户特定的代码将 在运行时编译,然后在 AppDomain 中执行。该过程可能需要 10 毫秒或 5 分钟。 AppDomain 将由Task.Factory.StartNew() 创建。工作正常。

现在我希望能够取消/中断执行。我可以按 代码执行时停止按钮,但如何取消任务?我知道: 有 CancellationToken.IsCancellationRequested 属性,但我不能 循环通过某事。这就是为什么我在执行时无法检查值 (原子)代码。并且卸载 AppDomain 并不会停止任务。

仅供参考:我参加了 Task 课程,因为它易于使用。如果 Thread 有用:没问题。

有人可以帮助我吗?一个简短的代码 sn-p 会很好:)。

谢谢。

【问题讨论】:

  • 您正在使用 System.CodeDom 来编译,对吗?您可以在开始编译之前以及开始加载新的 AppDomain 和创建代理对象之前取消。我认为 CodeDomProvider API 不允许在编译期间取消。

标签: task appdomain cancellation


【解决方案1】:

中止线程或任务是设计糟糕的解决方案的代码味道。

如果这是您的决定,您应该考虑到每一行代码都可能是最后执行的代码,并考虑释放任何可能使系统处于不一致状态的非托管资源、锁等。理论上我们应该始终如此小心,但实际上这并不成立。

如果你尝试使用 Thread 和邀请 .Abort() 方法,你应该认为 ThreadAbortException 是一个特殊的例外try-catchfinally 块。此外,您甚至无法确定线程将被中止。

关于使用任务,AFAIK(我不是 TPL 专家)恐怕你不能做你想做的事。您应该以某种方式重新设计您的逻辑以考虑取消令牌并彻底停止您的计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 2018-07-09
    相关资源
    最近更新 更多