#asp.net #multithreading #mutex #monitor #server-side
#asp.net #многопоточность #мьютекс #монитор #на стороне сервера
Вопрос:
У меня есть ASP.net (c #) приложение, содержащее часть кода, которая изменяет глобально доступный ресурс (например, файл web.config). Естественно, что при изменении ресурса для предотвращения условий гонки одновременно разрешается использовать только одного пользователя, поэтому мне нужно заблокировать код с помощью монитора:
блокировка (Global.globallyAccessibleStaticObject) { //..изменить ресурс //..сохранить ресурс }
Я был удовлетворен таким подходом к блокировке, но потом подумал, что, если этого недостаточно? должен ли я использовать мьютекс вместо этого? Я знаю, что мьютекс полезен для межпроцессной блокировки (во многих процессах и приложениях) и, следовательно, медленнее, но, учитывая характер развернутого asp.net страница (несколько запросов одновременно в нескольких доменах приложений), это необходимо?
Ответ, похоже, будет зависеть от того, как страницы asp обрабатываются на стороне сервера. Я провел исследование относительно http-конвейера, домена приложения, пула потоков и т.д. Но я по-прежнему в замешательстве относительно того, необходимо ли запрашивать блокировку между процессами для моей синхронизации, или достаточно блокировки внутри процесса для веб-приложения???
Примечание: Я не хочу увязать в конкретной задаче, потому что я хочу, чтобы этот вопрос оставался общим, поскольку он может быть уместен во многих (многопоточных) сценариях. Кроме того, я знаю, что есть другие способы выполнения этих задач (асинхронные обработчики / страницы, веб-службы и т.д.), Которые меня сейчас не волнуют.
Ответ №1:
Если ваше приложение выполняется только в одном AppPool, то оно выполняется в одном физическом w3wp.exe процесс, поэтому мониторов / блокировки должно быть достаточно для защиты общего ресурса. С помощью этой стратегии вам нужно защищать только несколько потоков, запущенных в одном процессе.
Комментарии:
1. Классический случай, когда следует прочитать другие ответы (например, @patrickmcdonald’s), прежде чем принимать решение. Допустим, эти ответы разделены несколькими годами.
Ответ №2:
Мы столкнулись с ситуацией в работе, когда у нас было приложение IIS, настроенное для запуска в одном AppDomain, но lock
этого было недостаточно для защиты доступа к ресурсу.
Причина, по которой мы думаем, что это происходило, заключается в том, что IIS перерабатывал AppDomain до снятия блокировки и запускал новый AppDomain, поэтому у нас возникали конфликты.
Переход на использование a Mutex
решил эту проблему для нас (пока).