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

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

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

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

谢谢。

#1楼 票数:0

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

如果这是您的决定,则应考虑每一行代码可能是最后要执行的代码,并考虑释放任何可能会使系统处于不一致状态的非托管资源,锁等。 从理论上讲,我们应该始终保持这种谨慎,但实际上这并不成立。

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

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

  ask by user1677419 translate from so

未解决问题?本站智能推荐:

1回复

如何在不调用IsCancellationRequested或ThrowIfCancellationRequested的情况下取消任务并引发异常

我创建2个任务。 Task1运行较长的计算( SingleLongMethod ), Task2必须在计算中间取消Task1 。 我发现的解决方案是调用token.ThrowIfCancellationRequested()或token.IsCancellationRequested 。
3回复

使用CancellationToken取消任务而不显式检查任务?

背景: 我有一个Web应用程序,它可以启动长期运行(和无状态)的任务: var task = Task.Run(() => await DoWork(foo))task.Wait(); 由于它们运行时间长,因此我需要能够从单独的Web请求中将其取消。 为此,我想使用Cancell
1回复

CancellationToken的任务状态不会更改

我正在实现一个下载程序类,我正在使用任务,首先我创建了一个任务并用它传递了CancellationToken,当我取消任务时,任务被取消但任务的状态仍在运行,即使我调用了ThrowIfCancellationRequested( )staus仍然是相同的。 如果我抛出ThrowIfCancel
3回复

如何在TPL中处理任务取消

再会! 我正在为 WinForms UI 编写一个帮助程序库。 开始使用 TPL async/await 机制并遇到这种代码示例的问题: 基本上,这个想法是运行两个并行任务 - 例如,进度条或任何更新和一种超时控制器,另一个是长时间运行的任务本身。 无论哪个任务先完成都会取消另一个任务。 因此,取消
1回复

轻松取消任务?[关闭]

关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来
6回复

等待取消任务的简洁方法?

我发现自己经常写这样的代码:try{ cancellationTokenSource.Cancel(); await task.ConfigureAwait(false); // this is the task that was cancelled}catch(OperationCan
1回复

使用OperationCanceledException自取消任务

我注意到任务可以通过抛出OperationCanceledException取消自身。 通常,可以在OperationCanceledException 构造函数中传递一个用户友好的原因,该构造函数随后成为异常消息。 但是,在任务场景中看起来不是那样。 该异常使任务被取消,但最终被转换为T
1回复

如何取消正在运行的任务?

我想取消一个正在运行的任务(当用户按下退出键时)。 当我单击“转义”键Form_KeyDown运行但不取消任务时!