c# - 是否有必要在处置前取消cancellationtoken

标签 c# memory cancellationtokensource

我大部分时间都将 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/

相关文章:

c# - 修改了应用程序导出集合;枚举操作可能无法执行

javascript - 你如何在Javascript中清除内存?

c# - 在不复制数据的情况下将字节数组转换为短裤数组

c++ - 解释 Valgrind 输出 C++

c# - 如何将 CancellationTokenSource 附加到 DownloadStringTaskAsync 方法并取消异步调用?

multithreading - F# 线程中的取消标记

c# - Process.Start() 不启动 .exe 文件(手动运行时有效)

c# - 如何创建自定义 NHibernate 配置属性?

c# - 同一属性的不同 getter 和 setter 接口(interface)

c# - 使用超时处理多个 CancellationToken