Связанный источник отмены не является особым видом отмены. Это обычный источник отмены, который также «связан» с существующим токеном, т. Е. Источник будет отменен при отмене существующего токена. В остальном это обычный источник отмены, поэтому вы можете отменить его самостоятельно, как и любой другой источник отмены.
Таким образом, вам нужен только один источник отмены - тот, который связан с существующим токеном и также можно отменить вручную:
public Task StartAsync(CancellationToken externalToken)
{
this.linkedCancellation = CancellationTokenSource.CreateLinkedTokenSource(externalToken);
this.execution = this.ExecuteAsync(this.linkedCancellation.Token);
return this.execution;
}
public async Task AbortAsync()
{
try
{
this.linkedCancellation.Cancel();
await this.execution;
}
catch
{
}
finally
{
this.linkedCancellation.Dipose();
}
}
В качестве дополнительного примечания я бы тщательно рассмотрел вопросы, связанные с пожизненным сроком службы, для такого рода разработки API. В настоящее время StartAsync
выполняет распределение ресурсов, а AbortAsync
выполняет очистку; Я бы порекомендовал проект, в котором они обрабатываются конструктором и Dispose
(RAII).