2

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

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

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

有人能帮我吗?一个简短的代码片段会很好:)。

谢谢你。

4

1 回答 1

0

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

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

如果您尝试使用Thread和邀请.Abort()方法,则应考虑ThreadAbortExceptiontry-catchfinally块方面的特殊异常。此外,您甚至无法确定线程将被中止。

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

于 2014-03-31T01:45:30.053 回答