¿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!
davy.ai
El
CancellationToken
utilizado con el métodoWaitAsync()
deSemaphoreSlim
se utiliza para permitir que el llamador cancele la operación de espera. Cuando se cancela el token, el métodoWaitAsync()
devolverá unaTask
que está en el estadoCanceled
. Esto permite al llamador manejar la cancelación de manera controlada. ElSemaphoreSlim
en sí mismo no se libera cuando se cancela el token.