ASP.Net - контролирует / блокирует или мьютекс - PullRequest
4 голосов
/ 27 апреля 2011

У меня есть ASP.net (c #) приложение, в котором есть часть кода, которая изменяет глобально доступный ресурс (например, файл web.config).Естественно, при изменении ресурса, чтобы предотвратить состояние гонки, разрешается использовать только одного пользователя за раз, поэтому мне нужно заблокировать код с помощью монитора:

lock (Global.globallyAccessibleStaticObject) {//..modify resource //..сохранить ресурс}

Я был удовлетворен этим подходом к блокировке, но потом подумал, а что, если этого недостаточно?я должен использовать мьютекс вместо этого?Я знаю, что мьютекс полезен для межпроцессной блокировки (во многих процессах и приложениях) и, следовательно, медленнее, но, учитывая характер развернутой страницы asp.net (несколько запросов одновременно в нескольких доменах приложений), это необходимо?

Ответ, похоже, будет зависеть от того, как обрабатываются ASP-страницы на стороне сервера.Я провел исследование, касающееся http-конвейера, домена приложения, пула потоков и т. Д., Но я все еще не понимаю, нужно ли запрашивать межпроцессную блокировку для моей синхронизации или достаточно внутрипроцессной блокировки для веб-приложения ???

Примечание : я не хочу увлекаться конкретной задачей, потому что хочу, чтобы этот вопрос оставался общим, поскольку он может быть актуален во многих (многопоточных) сценариях.Кроме того, я знаю, что есть больше способов выполнить эти задачи (асинхронные обработчики / страницы, веб-службы и т. Д.), Которые меня сейчас не волнуют.

Ответы [ 2 ]

4 голосов
/ 27 апреля 2011

Если ваше приложение работает только в одном AppPool, то оно выполняется в одном физическом процессе w3wp.exe, поэтому для защиты общего ресурса должно быть достаточно мониторов / блокировки. При такой стратегии вам нужно защищать только потоки, работающие в одном и том же процессе.

2 голосов
/ 20 августа 2015

В работе мы столкнулись с ситуацией, когда у нас было приложение IIS, настроенное для работы в одном домене приложений, но lock было недостаточно для защиты доступа к ресурсу.

Причина, по которой мы думаем, что это произошло, заключается в том, что IIS перезапускал домен приложений до снятия блокировки и запускал новый домен приложений, поэтому у нас возникали конфликты.

Изменение использования Mutex решило эту проблему для нас (пока).

...