停止在给定时间间隔后超时的CancellationTokenSource以保持其状态
本文关键字:CancellationTokenSource 状态 超时 定时间 | 更新日期: 2023-09-27 18:13:02
我有一个方法,它接受一个允许该方法的用户取消它正在做的事情的CancellationToken
。在这个方法中,我使用这个CancellationToken
和一个CancellationTokenSource
来创建一个链接的CancellationTokenSource
。
var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(msTimeout));
var timeoutAndCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(
timeoutTokenSource.Token, cancelWaitToken);
然后我启动一个while
循环,不断检查是否有某个值达到目标,否则我await
和Task.Delay
。循环有两个退出条件,如果达到目标值,或者如果timeoutAndCancelTokenSource.IsCancellationRequested
为真。
当循环退出时,我可以询问timeoutTokenSource
和cancelWaitToken
,以确定是否由于超时而取消循环,它被取消,或者是否达到目标值。
我看到的问题是,当循环退出时,timeoutTokenSource
仍在倒计时。因此,如果超时时间只剩下几毫秒,我可能会对循环中发生的事情做出错误的假设。
是否有办法停止CancellationTokenSource
,使其不超时?
是否有一种方法来停止CancellationTokenSource,使其不超时?
错误的问题。(顺便说一句,这是不可能阻止的)。
正确的问题应该是"我如何确定循环是否因为超时而取消,它是否被取消,或者是否达到了目标值?"
答案是修复这个:
循环有两个退出条件,如果达到目标值或timeoutAndCancelTokenSource。IsCancellationRequested为真。
循环应该只在达到目标值时退出。它应该把(链接的)CancellationToken
传递给Task.Delay
。
然后,当你catch
OperationCanceledException
时,你检查你的cancelWaitToken
和timeoutTokenSource.Token
,看看哪一个被取消了。
因此,如果超时时间只剩下几毫秒,我可能会对循环中发生的事情做出错误的假设。
是的。如果更改循环退出条件,则只知道它是否达到了目标值。在您检查时,两个取消令牌可能会发出信号,但我相信这是一个良性竞争条件。如果cancelWaitToken
发出信号,它是否超时真的重要吗?