gpt4 book ai didi

c# - 停止在给定时间跨度后超时的 CancellationTokenSource 以保持其状态?

转载 作者:行者123 更新时间:2023-11-30 21:45:32 24 4
gpt4 key购买 nike

我有一个接受 CancellationToken 的方法,该方法允许该方法的用户取消其正在执行的操作。在该方法中,我使用此 CancellationToken 以及 CancellationTokenSource 创建了链接的 CancellationTokenSource

var timeoutTokenSource = new CancellationTokenSource(TimeSpan.FromMilliseconds(msTimeout));
var timeoutAndCancelTokenSource = CancellationTokenSource.CreateLinkedTokenSource(
timeoutTokenSource.Token, cancelWaitToken);

然后,我启动一个 while 循环,不断检查某个值是否已达到目标,否则我 await 一个 Task.Delay 。如果达到目标值或 timeoutAndCancelTokenSource.IsCancellationRequested 为 true,则循环有两个退出条件。

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

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

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

最佳答案

Is there a way to stop a CancellationTokenSource so that it does not timeout?

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

正确的问题是“如何确定循环是由于超时而取消、被取消还是达到了目标值?”

答案是解决这个问题:

The loop has two exit conditions, if the target value is reached or if the timeoutAndCancelTokenSource.IsCancellationRequested is true.

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

然后,当您捕获 OperationCanceledException 时,您会检查 cancelWaitTokentimeoutTokenSource.Token 以查看哪个一项已取消。

So if there is only a few milliseconds left on the timeout that I could possibly make false assumptions about what happened within the loop.

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

关于c# - 停止在给定时间跨度后超时的 CancellationTokenSource 以保持其状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40046910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com