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

C# 停止在给定时间间隔后超时以保持其状态的CancellationTokenSource?,c#,task-parallel-library,C#,Task Parallel Library,我有一个接受CancellationToken的方法,它允许该方法的用户取消它正在做的事情。在方法中,我使用此CancellationToken以及CancellationTokenSource来创建链接的CancellationTokenSource var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(msTimeout)); var timeoutAndCancelTokenSource

我有一个接受
CancellationToken
的方法,它允许该方法的用户取消它正在做的事情。在方法中,我使用此
CancellationToken
以及
CancellationTokenSource
来创建链接的
CancellationTokenSource

var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(msTimeout));
var timeoutAndCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(
        timeoutTokenSource.Token, cancelWaitToken);
然后,我启动一个
while
循环,不断检查某个值是否达到目标,否则我将
等待
任务。延迟
。如果达到目标值,或者如果
timeoutAndCancelTokenSource.IsCancellationRequested
为true,则循环有两个退出条件

当循环退出时,我可以询问
timeoutTokenSource
cancelWaitToken
以确定循环是否因超时而取消,是否已取消,或者是否达到目标值

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

是否有方法停止
取消令牌源
以使其不超时?

有没有办法停止CancellationTokenSource,使其不会超时

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

正确的问题是“如何确定循环是否由于超时而取消,是否已取消,或者是否已达到目标值?”

答案是解决这个问题:

如果达到目标值,或者如果timeoutAndCancelTokenSource.IsCancellationRequested为true,则循环有两个退出条件

只有当达到目标值时,循环才会退出。它应该将(链接的)
CancellationToken
传递到
Task.Delay

然后,当您捕获
OperationCanceledException
时,检查您的
cancelWaitToken
timeoutTokenSource.Token
以查看哪一个被取消

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


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

除了设置超时之外,是否还有其他方法通过
CancellationTokenSource
手动取消令牌?这基本上就是我最后要做的。谢谢斯蒂芬!