gpt4 book ai didi

c# - 可以立即终止的任务等价物

转载 作者:太空宇宙 更新时间:2023-11-03 20:11:12 25 4
gpt4 key购买 nike

我想在后台运行一个长时间运行的操作。要求是:

  1. 操作应该异步运行到调用线程。

  2. 调用线程可以等待操作完成并获取其结果

  3. 一旦超时,应立即中止操作。

我本来可以使用任务,但据我所知,没有任何机制可以彻底终止任务。取消 token 不适合我,如果任务因未知原因卡住,我只会终止任务 - (错误),这是一种故障安全机制。不用说,如果任务卡住了,请求取消也没用。BackgroundWorker 也是如此。

有什么比在调用线程和后台线程之间使用共享对象更灵活的吗?

最佳答案

没有什么比使用共享对象更优雅的了,因为使用共享对象是做到这一点的优雅方式:)

您无法提供一种安全终止任务的通用方法:由于终止线程在试图终止它时不知道被杀线程正在做什么,这可能会使您的对象模型处于“损坏”状态。

Thread.Abort() 的创建是为了尽可能以最干净的方式做到这一点:通过抛出异常(允许“finally”语句处理已用资源,或在终止线程上运行事务处理)。但是这种方法会使代码在意想不到的地方抛出异常。强烈不推荐。

注意:Thread.Abort() 在任何情况下都不起作用(例如:如果您的线程正在通过 P/Invoke 运行 native 代码,则不会起作用)

因此,优雅的解决方案是编写干净的代码,它可以决定何时它想要被杀死(通过取消 token ) .

nb2: 最终的“Thread.Abort()”在任何情况下都可以工作,并且可以保持隔离:创建一个新的 AppDomain,在这个 AppDomain 中运行你的可终止代码(通过远程处理),并在您想要停止一切时调用 AppDomain.Unload()。

不过,这是一个非常极端的解决方案。

关于c# - 可以立即终止的任务等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19910536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com