停止在给定时间间隔后超时的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循环,不断检查是否有某个值达到目标,否则我awaitTask.Delay。循环有两个退出条件,如果达到目标值,或者如果timeoutAndCancelTokenSource.IsCancellationRequested为真。

当循环退出时,我可以询问timeoutTokenSourcecancelWaitToken,以确定是否由于超时而取消循环,它被取消,或者是否达到目标值。

我看到的问题是,当循环退出时,timeoutTokenSource仍在倒计时。因此,如果超时时间只剩下几毫秒,我可能会对循环中发生的事情做出错误的假设。

是否有办法停止CancellationTokenSource,使其不超时?

停止在给定时间间隔后超时的CancellationTokenSource以保持其状态

是否有一种方法来停止CancellationTokenSource,使其不超时?

错误的问题。(顺便说一句,这是不可能阻止的)。

正确的问题应该是"我如何确定循环是否因为超时而取消,它是否被取消,或者是否达到了目标值?"

答案是修复这个:

循环有两个退出条件,如果达到目标值或timeoutAndCancelTokenSource。IsCancellationRequested为真。

循环应该只在达到目标值时退出。它应该把(链接的)CancellationToken传递给Task.Delay

然后,当你catch OperationCanceledException时,你检查你的cancelWaitTokentimeoutTokenSource.Token,看看哪一个被取消了。

因此,如果超时时间只剩下几毫秒,我可能会对循环中发生的事情做出错误的假设。

是的。如果更改循环退出条件,则只知道它是否达到了目标值。在您检查时,两个取消令牌可能会发出信号,但我相信这是一个良性竞争条件。如果cancelWaitToken发出信号,它是否超时真的重要吗?

相关文章:
  • 没有找到相关文章