В некоторых учебниках asp, таких как это, я наблюдаю следующий шаблон:
Application.Lock
'do some things with the application object
Application.Unlock
Однако, поскольку веб-страницы могут иметь несколько экземпляров, возникает очевидная проблема параллелизма. Итак, мои вопросы следующие:
Что делать, если одна страница пытается заблокировать, а объект уже заблокирован?
Есть ли способ определить, заблокирован ли объект приложения?
Лучше просто работать с разблокированным объектом приложения или это имеет другие последствия?
Что, если есть только одно действие с объектом приложения? ~ Есть ли причина для блокировки / разблокировки в этом случае?





Если одна страница пытается заблокировать объект Application, когда он уже заблокирован, она будет ждать, пока страница, удерживающая блокировку, не снимет его. Обычно это происходит быстро (код ASP обычно должен удерживать блокировку достаточно долго для доступа к общему объекту, хранящемуся в приложении).
Будут последствия, если вы воспользуетесь разблокированным объектом приложения. Например, если вы хотите реализовать глобальный счетчик: -
Application("myCounter") = Application("myCounter") + 1
Приведенный выше код иногда ошибается. Этот код читает, добавляет и присваивает. Если два потока попытаются выполнить это одновременно, они могут прочитать одно и то же значение, а затем записать одно и то же значение, увеличивая myCounter на 1 вместо 2.
Необходимо убедиться, что второй поток не может читать myCounter, пока второй поток не запишет в него. Следовательно, это лучше: -
Application.Lock
Application("myCounter") = Application("myCounter") + 1
Application.Unlock
Конечно, возникают проблемы с параллелизмом, если блокировка удерживается в течение длительного времени, особенно если есть другие применения приложения, на которые не влияет код, удерживающий блокировку.
Следовательно, вам следует избегать дизайна, который требует длительной блокировки приложения.
Метод Lockблокирует других клиентов от изменения переменных, хранящихся в объекте Application, гарантирует, что только один клиент за раз может изменять или получать доступ к переменным приложения.
Если вы явно не звони метод Application.Unlock, сервер разблокирует заблокированный объект Application, когда файл .asp заканчивается или время истекает.
Блокировка объекта Application сохраняется в течение очень короткого времени, поскольку объект приложения разблокируется, когда страница завершает обработку или истекает время ожидания.
Если одна страница блокирует объект приложения, а вторая страница пытается сделать то же самое, в то время как первая страница все еще заблокирована, вторая страница будет ждать завершения первой или пока не будет достигнут предел Server.ScriptTimeout.
Пример:
<%@ Language = "VBScript" %>
<%
Application.Lock
Application("PageCalls") = Application("PageCalls") + 1
Application("LastCall") = Now()
Application.Unlock
%>
This page has been called <%= Application("PageCalls") %> times.
В приведенном выше примере метод Lockпредотвращает одновременный доступ более чем одного клиента к переменной PageCalls. Если бы приложение не было заблокировано, два клиента могли одновременно попытаться увеличить значение переменной PageCalls.
Это копия из Справочная страница MSDN для
Application.Lock- без причитающихся кредитов.