我想弄清楚CancellationTokenSource.CreateLinkedTokenSource
到底做了什么。我知道这是一个常规的取消源,也是与现有令牌“链接”的。
下面的代码片段执行以下操作:
它实际上是一次又一次地重用同一个cts
实例。这是CancellationTokenSource.CreateLinkedTokenSource
的行为吗?我的意思是,当一个CancellationTokenSource被取消时,我不应该再次使用它,除非我创建一个新的。
如果是这样的话,为什么代码片段将一个CancellationToken
传递给Start方法,而我们实际上从来没有取消过cts
,但实际上取消了链接的cts
?
// Program.cs
var cts = new CancellationTokenSource();
await foreach (var item in items.Start(cts.Token))
{
Console.WriteLine(item);
item.Stop();
item.Start(cts.Token);
}
private CancellationTokenSource? _cts;
public IAsyncEnumerable<string> Start(CancellationToken cancellationToken)
{
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
...
}
public void Stop()
{
_cts?.Cancel();
}
发布于 2022-03-05 01:17:58
一旦发出Cancel()
并希望重用CancellationTokenSource,请通过IsCancellationRequested
执行检查,如果为真,请释放_cts并重新创建_cts。
if (_cts.IsCancellationRequested)
{
_cts.Dispose();
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
}
https://stackoverflow.com/questions/71358689
复制相似问题