gpt4 book ai didi

c# - 在任务取消时处理 CancellationTokenSource 的代码是否正确?

转载 作者:可可西里 更新时间:2023-11-01 08:08:45 29 4
gpt4 key购买 nike

我看到这段代码在我面前,我很怀疑:

CancellationTokenSource _cts;

public void Dispose();
{
_cts.Cancel();
_cts.Dispose();
_task.Wait(); //wait for the task to be canceled!?
}

取消后直接调用 _cts.Dispose() 是否安全?如果要这样做,是否会处理被取消任务所需的 CancellationTokenSource 基础资源以成功等待 CancellationToken?

最佳答案

Is it safe to call _cts.Dispose() straight after cancel?

为了了解这一点,我们需要了解取消 CancellationTokenSource 时会发生什么。

当您取消 CancellationTokenSource 时,它会继续调用通过 CancellationToken 注册的任何回调,它通过 CancellationToken 持有对其父源的引用。 Register() 方法。

当您处理 CTS 时,将尝试从 token 中注销任何已注册的链接回调。如果它当前正在执行,它将等到它的委托(delegate)完成。

这意味着,尽管您已经处置了 CTS,但它的对象仍由 token 引用。因此,它仍然不符合收集条件。

现在让我们看看CancellationToken.IsCancellationRequested:

public bool IsCancellationRequested 
{
get
{
return m_source != null && m_source.IsCancellationRequested;
}
}

这意味着在处置时,检查取消将产生 true。这意味着,您在调用 dispose 后等待任务完成是安全的。

作为旁注,如果您(出于某种原因)尝试通过已处置的 CancellationTokenSource 传递 token ,您将遇到 ObjectDisposedException

编辑:

我想补充两点。首先,让我说我不推荐使用这种方法。它应该适用于某些代码执行路径,但不适用于所有路径。 CancellationTokenSource 通常只有在您使用它的 WaitHandle 属性时才应该被释放。否则,将其留给 GC 进行清理就可以了。但是,由于这是口味问题,您可以选择您喜欢的任何一个。我当然建议仅在您确定任务已遵守取消请求后才进行处理。

根据 WaitHandle 的用法,一旦您释放它,它就会被释放并清空,因此它将无法被访问。

关于c# - 在任务取消时处理 CancellationTokenSource 的代码是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779842/

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