Этот вопрос немного разрознен, однако давайте попытаемся разобраться в нем немного
Во-первых, Давайте разберемся в правильном шаблоне
try
{
await _semphoreSlimCreateArende.WaitAsync();
// do your sync work here
}
finally
{
// if this throws you are certainly doing something wrong
_semphoreSlimCreateArende.Release();
}
Во-вторых, , вам следует отобрать у вас клавиатуру для этого
catch (Exception)
{
}
Никогда не ешьте вслепую исключения, а если вы получаете их на _semphoreSlimCreateArende.Release
, у вас уже есть серьезные проблемы, и вынужно выяснить, почему
Должны ли семафорлимы быть на уровне контроллера?
Использовать их на уровне, который имеет больше смысла, я имею в виду, если вам нужносинхронизировать кусок кода, синхронизировать его там, а не на 13 уровней.
Или я должен изменить действия контроллеров, чтобы они не были асинхронными?
, если у вас есть asnyc
работаем, сделаем ваш контроллер async
и позволим ему распространяться вниз по стеку к вашему async
коду
Мы имеем тупиковое поведение в нашей производственной среде, и мне интересно, правильно ли мы используем семафорлис.
Вау, мы такиеlking DataBase Deadlocks или Context Deadlocks.В любом случае все это звучит немного подозрительно
К вашему сведению
Использование SemaphoreSlim
в веб-сервисе может быть неприятным подходом.SemaphoreSlim
работает на спин-блокировке и не должен использоваться для чего-либо, что блокирует в течение любого периода времени.Спинлоки блокируют процессор, ожидая снятия блокировки.Идеально, если вы используете их, когда немного кусает блокировку, и в ситуациях, которые не блокируют дальше по цепочке.
Если вы используете код взаимоблокировки, то вам нужно точно определить, что вызывает тупик, если это взаимоблокировка на основе задач, то SemaphoreSlim
не является подходящим инструментом для работы, если он неблокирующая гонка, тогда, возможно, это немного более приемлемо.Если это тупик базы данных, то у вас есть большая проблема.