首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >能够重用相同的CancellationTokenSource.CreateLinkedTokenSource - CancellationTokenSource

能够重用相同的CancellationTokenSource.CreateLinkedTokenSource - CancellationTokenSource
EN

Stack Overflow用户
提问于 2022-03-05 01:06:53
回答 1查看 583关注 0票数 3

我想弄清楚CancellationTokenSource.CreateLinkedTokenSource到底做了什么。我知道这是一个常规的取消源,也是与现有令牌“链接”的。

下面的代码片段执行以下操作:

  • 打印消息>取消任务->再次启动任务->打印消息->再次取消任务等等。

它实际上是一次又一次地重用同一个cts实例。这是CancellationTokenSource.CreateLinkedTokenSource的行为吗?我的意思是,当一个CancellationTokenSource被取消时,我不应该再次使用它,除非我创建一个新的。

如果是这样的话,为什么代码片段将一个CancellationToken传递给Start方法,而我们实际上从来没有取消过cts,但实际上取消了链接的cts

代码语言:javascript
运行
复制
// Program.cs
var cts = new CancellationTokenSource();

await foreach (var item in items.Start(cts.Token))
{
    Console.WriteLine(item);
    item.Stop();
    item.Start(cts.Token);
}
代码语言:javascript
运行
复制
private CancellationTokenSource? _cts;

public IAsyncEnumerable<string> Start(CancellationToken cancellationToken)
{
    _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);

    ...
}

public void Stop()
{
    _cts?.Cancel();
}
EN

回答 1

Stack Overflow用户

发布于 2022-03-05 01:17:58

一旦发出Cancel()并希望重用CancellationTokenSource,请通过IsCancellationRequested执行检查,如果为真,请释放_cts并重新创建_cts。

代码语言:javascript
运行
复制
if (_cts.IsCancellationRequested)
{
    _cts.Dispose();
    _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71358689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档