Вариант А здесь более правильный.Вам не нужно Release
SemaphoreSlim
при отмене, поскольку вы фактически никогда не получаете и не увеличиваете его счет.Таким образом, вы не хотите выпускать, если ваш Wait
вызов фактически не был успешным.Программист несет ответственность за то, чтобы поток не выпускал семафор слишком много раз.Например, предположим, что семафор имеет максимальное число, равное двум, и что поток A и поток B оба входят в семафор.Если из-за ошибки программирования в потоке B он дважды вызывает Release, оба вызова завершаются успешно.Счетчик семафора полон, и когда поток A в конце концов вызывает Release, генерируется исключение SemaphoreFullException.