异步/等待取消机制

Mas*_*ile 6 c# async-await

我有一个问题,可以使用什么机制取消正在进行的异步操作,而不是async/await上下文中的取消令牌.我确信这是一个经过充分研究的设计决策,考虑到语言的命令性,但在实际情况下,必须将取消对象传递给所有异步方法至少有点痛苦.还有来自c#社区的另一个设计思路,或者建议的取消机制是否正常?我想我错过了什么.

Kei*_*thS 4

取消令牌是最佳实践,特别是当异步过程成本高昂、没有预设结束条件或涉及外部资源时。

但是,如果您愿意,您可以简单地“放弃”。不是告诉异步线程中止处理并清理,而是“超时”;停止等待它完成,分离所有侦听器,然后继续运行。当线程最终完成时,它将检查其事件,意识到没有人在监听,然后默默地终止。优点是简单,但在很多情况下这可能是一件坏事:

  • 如果异步进程将永远继续处理,除非您告诉它停止,否则它将继续在后台运行,占用 CPU 和其他资源,直到应用程序关闭,此时线程将被杀死。
  • 如果异步线程正在执行可中止的、可逆的工作单元(例如数据库操作),那么如果用户按下“取消”,他们预计到目前为止所做的任何事情都会被回滚。如果你停止聆听并继续前进,他们会得到的是他们认为取消的内容已经执行了。
  • 在大多数情况下,异步操作涉及外部资源,这些资源需要时间来处理,并且还需要适当的清理。网络套接字必须断开,数据库连接关闭,文件解锁等。尽管放弃意味着您不必处理这些问题,而是让线程正常结束,但常见的用户体验是用户感到厌倦,点击取消然后重试该操作。这意味着您在之前的异步操作中使用的资源必须被释放才能再次使用。