【发布时间】:2020-05-04 10:41:36
【问题描述】:
在获得CancellationToken (StartAsync) 的方法中,我想添加一个内部CancellationToken,以便调用者可以在外部或内部取消异步操作(例如,通过调用AbortAsync() 方法)。
AFAIK,方法是使用CreateLinkedCancellationTokenSource。但它的 API 似乎相当不舒服,因为我需要为此创建 两个 额外的 CancellationTokenSource 实例,并且因为它们实现了 IDisposable,我也必须不要忘记处理它们。因此,我需要将它们都存储为成员以供以后处理。
我错过了什么吗?我觉得应该有一种更简单的方法来为现有令牌附加一个额外的取消机制,这不会强迫我维护两个 CancellationTokenSource 实例。
public Task StartAsync(CancellationToken externalToken)
{
this.actualCancellation = new CancellationTokenSource();
this.linkedCancellation = CancellationTokenSource.CreateLinkedTokenSource(
actualCancellation.Token, externalToken);
this.execution = this.ExecuteAsync(this.linkedCancellation.Token);
return this.execution;
}
public async Task AbortAsync()
{
try
{
this.actualCancellation.Cancel();
await this.execution;
}
catch
{
}
finally
{
this.actualCancellation.Dispose();
this.linkedCancellation.Dispose();
}
}
【问题讨论】:
-
附带说明,处理
CancellationTokenSource可能不是绝对关键。 Here 是我对此的看法。有人报告memory leaks是由未处理的CTS引起的,但我没有设法重现它。
标签: c# .net-core task-parallel-library cancellationtokensource