我想弄清楚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
复制相似问题