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
手动取消令牌?这基本上就是我最后要做的。谢谢斯蒂芬!