Joe*_*Joe 9 .net c# task-parallel-library cancellationtokensource
CancellationTokenSource有TryReset()会员。该文档看起来如此严格,让我想知道它为什么存在。
Cancel()它的情况下它才会起作用。那么人们为什么要费心呢TryReset?为什么不简单地为每个异步操作创建一个全新的CancellationTokenSource,然后在操作完成且不再需要取消后将其丢弃?CancellationTokenSource创建一个对象是否非常昂贵?
让我在这里引用该问题的背景和动机部分
当库或框架公开
CancellationToken通常不会被取消的(例如HttpContext.RequestAborted)时,它们通常仍然需要在操作完成后处置支持CancellationTokenSource(CTS),而不是重用它,以便考虑到可能永远不会处置其注册的调用者。为了使用该示例,Kestrel 在访问令牌的
RequestAborted每个请求之后都会处理后备 CTS 。RequestAborted如果 Kestrel 尝试重用支持RequestAborted未来请求的令牌的 CTS 以减少分配,则可能会泄露任何未处理的注册,并在不相关的请求中止时触发未处理的注册。人们希望能够“重置”CTS 的另一种情况是在调用
CancelAfter(). 这已经可以通过调用 来实现CancelAfter(Timeout.Infinite),但是除非您阅读文档,否则这不一定是显而易见的。TryReset()在这种情况下,当查看智能感知完成时,这是立即有意义的。另一个好处是,如果重置失败,立即显而易见。如果您尝试使用 重置超时
CancelAfter(),则必须在调用后进行检查,以验证在调用之前或调用期间没有取消导致CancelAfter()无操作。这在第二个HttpClient使用示例中得到了演示。