2016-10-14 28 views
2

我有一个方法接受CancellationToken,它允许方法的用户取消它正在做的事情。在此方法中,我使用此CancellationToken以及CancellationTokenSource来创建链接CancellationTokenSource停止CancellationTokenSource在给定TimeSpan后超时以保持其状态?

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

我然后开始while循环,不断地检查,看看是否一定的价值已经达到了目标,否则我await一个Task.Delay。如果达到目标值或者timeoutAndCancelTokenSource.IsCancellationRequested为真,则循环有两个退出条件。

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

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

有没有办法阻止CancellationTokenSource,使其不超时?

+0

除了设置超时之外,是否有其他方法通过'CancellationTokenSource'来手动取消令牌? –

回答

3

有没有办法阻止CancellationTokenSource,使其不超时?

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

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

答案是解决这个问题:

回路有两种退出条件,如果达到目标值,或者如果timeoutAndCancelTokenSource.IsCancellationRequested是真实的。

只有到达目标值时,循环才应该退出。它应该通过(链接)CancellationTokenTask.Delay

然后,当你catchOperationCanceledException,你检查你的cancelWaitTokentimeoutTokenSource.Token看哪一个被取消。

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

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

+0

这基本上是我最终结束的。感谢斯蒂芬! – KDecker

相关问题