es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué no se libera el semáforo cuando se cancela el cancellationToken dado?

SemaphoreSlim tiene un método WaitAsync() que toma un CancellationToken. Esperaría que el semáforo se libere cuando se cancele ese token, pero parece que ese no es el caso. Considere el siguiente código:

var tokenSource = new CancellationTokenSource();
var semaphore = new SemaphoreSlim(1, 1);
// CurrentCount es 1
await semaphore.WaitAsync(tokenSource.Token);
// CurrentCount es 0 como esperaríamos

tokenSource.Cancel(); // El token se cancela

para (var i = 0; i < 10; i++)
{
     var c = semaphore.CurrentCount; // El recuento actual permanece en 0, incluso si se cancela el token
     await Task.Delay(1000);
}

Incluso después de que se cancela el token, el CurrentCount permanece en 0. Supongo que esto es por diseño, pero ¿para qué se usa exactamente CancellationToken si no es para liberar el semáforo cuando se cancela el token? ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El CancellationToken utilizado con el método WaitAsync() de SemaphoreSlim se utiliza para permitir que el llamador cancele la operación de espera. Cuando se cancela el token, el método WaitAsync() devolverá una Task que está en el estado Canceled. Esto permite al llamador manejar la cancelación de manera controlada. El SemaphoreSlim en sí mismo no se libera cuando se cancela el token.

Comments are closed.