Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

232
Visualizações
¿Cómo crear un CancellationTokenSource jerárquico?

En nuestro proyecto, hemos decidido proporcionar un mecanismo de cancelación para los usuarios con la ayuda de CancellationToken .

Debido a la estructura de los trabajos en el proyecto, necesito un mecanismo de cancelación jerárquico. Por jerárquico, me refiero a que la cancelación de la fuente principal hace que todas las fuentes secundarias se cancelen recursivamente, pero las cancelaciones de las fuentes secundarias no se propagan a la principal.

¿Existe tal opción disponible en .NET lista para usar? De lo contrario, no estoy seguro de si registrar un delegado en el token principal es suficiente o si se deben dar más consideraciones.

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Sí, esta funcionalidad existe lista para usar. Consulte el método CancellationTokenSource.CreateLinkedTokenSource .

Crea un CancellationTokenSource que estará en estado cancelado cuando alguno de los tokens de origen esté en estado cancelado.

Ejemplo:

 using var parentCts = new CancellationTokenSource(); using var childrenCts = CancellationTokenSource .CreateLinkedTokenSource(parentCts.Token); parentCts.Cancel(); // Cancel the children too childrenCts.Cancel(); // Doesn't affect the parent
over 4 years ago · Santiago Trujillo Relatório

0

Según la implementación en el código fuente de Linked2CancellationTokenSource , llegué a esta implementación:

 public class HierarchicalCancellationTokenSource : CancellationTokenSource { private readonly CancellationTokenRegistration _parentReg; public HierarchicalCancellationTokenSource(CancellationToken parentToken) { this._parentReg = parentToken.Register( static s => ((CancellationTokenSource)s).Cancel(false), this, useSynchronizationContext: false); } protected override void Dispose(bool disposing) { if (disposing) { this._parentReg.Dispose(); } base.Dispose(disposing); } }

Y una demostración:

 CancellationTokenSource[] CreateChildSources(CancellationTokenSource parentSource) => Enumerable.Range(0, 2) .Select(_ => new HierarchicalCancellationTokenSource(parentSource.Token)) .ToArray(); var rootSource = new CancellationTokenSource(); var childSources = CreateChildSources(rootSource); var grandChildSources = childSources.SelectMany(CreateChildSources).ToArray(); var allTokens = new[] { rootSource.Token } .Concat(childSources.Select(s => s.Token)) .Concat(grandChildSources.Select(s => s.Token)) .ToArray(); for (int i = 0; i < allTokens.Length; i++) { allTokens[i].Register( i => Console.WriteLine( $"{new string('+', (int)Math.Log2((int)i))}{i} canceled."), i + 1); } rootSource.Cancel(); /* Output: 1 canceled. +3 canceled. ++7 canceled. ++6 canceled. +2 canceled. ++5 canceled. ++4 canceled. */
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda