我大部分时间都将 CancellationTokenSource
用于超时目的。为避免忘记 dispose
,当我完成 CancellationTokenSource
时,我使用了 using
语句。但是在 using
语句结束之前,我总是执行一个 CancellationTokenSource.Cancel()
。
如果没有使用取消,是否需要在销毁前取消CancellationTokenSource
?
这是我执行此操作的代码示例。
using (CancellationTokenSource TokenSource = new CancellationTokenSource(nTimeout * 1000))
{
for (int i = 0; i < nLoop; i++)
{
if (TokenSource.Token.IsCancellationRequested)
{
bSuccess = false;
break;
}
await Task.Delay(cDelay);
// do some work
}
TokenSource.Cancel();
}
最佳答案
CancellationTokenSource
处理后,基于此源的 token 可能会抛出 ObjectDisposedException
,因此您不应在源已处理后使用 CancellationTokenSource.Token
被处置。幸运的是,我没有在您的代码中看到这种情况。
当您取消 CancellationTokenSource
时,它会更改状态并通知已为 token 注册的回调。但是,当您的代码即将处理 CancellationTokenSource
时,您已经使用完 token ,无需取消它。
因此,在您的情况下,没有必要在处理 CancellationTokenSource
之前取消它。但是,您的用例有些特殊。当您有后台任务时,您应该等待任务完成,然后再处理源(如我开头段落中所述):
using (var cts = new CancellationTokenSource()) {
var task = Task.Run(() => DoSomething(cts.Token));
// Cancel cts or let it cancel itself based on a timeout.
// Then wait for the task to end.
await task;
}
关于c# - 是否有必要在处置前取消cancellationtoken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48538934/