Объект приложения и вопросы параллелизма

В некоторых руководствах по asp, таких как это, я наблюдаю следующую закономерность:

Приложение.Блокировка

'сделать что-нибудь с объектом приложения

Приложение. Разблокировать

Однако, поскольку веб-страницы могут иметь несколько экземпляров, возникает очевидная проблема параллелизма. Итак, мои вопросы следующие:

Что делать, если одна страница пытается заблокироваться, когда объект уже заблокирован?

Есть ли способ определить, заблокирован ли объект приложения?

Лучше просто работать с разблокированным объектом приложения или это имеет другие последствия?

Что, если есть только одно действие, связанное с объектом приложения? ~Есть ли причина для блокировки/разблокировки в этом случае?


person Alexandros Marinos    schedule 04.10.2008    source источник


Ответы (3)


Из документации MSDN:

Метод Lock запрещает другим клиентам изменять переменные, хранящиеся в объекте приложения, гарантируя, что только один клиент в каждый момент времени может изменять или получать доступ к переменным приложения.

Если вы не вызываете метод Application.Unlock явно, сервер разблокирует заблокированный объект Application, когда файл .asp заканчивается или истечет время ожидания.

Блокировка объекта приложения сохраняется в течение очень короткого времени, поскольку объект приложения разблокируется, когда страница завершает обработку или истекает время ожидания.

Если одна страница заблокирует объект приложения, а вторая страница попытается сделать то же самое, в то время как первая страница все еще заблокирована, вторая страница будет ждать завершения первой или пока не будет достигнут предел 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.

person splattne    schedule 04.10.2008
comment
Это копия и вставка с справочной страницы MSDN для Application.Lock. без должного кредита. - person Lumi; 29.11.2011

Будут последствия, если вы используете разблокированный объект приложения. Например, если вы хотите реализовать глобальный счетчик:

Application("myCounter") = Application("myCounter") + 1

Вышеупомянутый код будет время от времени ошибаться. Этот код читает, добавляет и присваивает. Если два потока попытаются выполнить это одновременно, они могут прочитать одно и то же значение, а затем записать одно и то же значение, увеличивая myCounter на 1 вместо 2.

Что необходимо, так это гарантировать, что второй поток не сможет прочитать myCounter, пока второй поток не запишет в него. Следовательно, это лучше: -

Application.Lock

Application("myCounter") = Application("myCounter") + 1

Application.Unlock

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

Следовательно, вам следует избегать дизайна, который требует длительной блокировки приложения.

person AnthonyWJones    schedule 04.10.2008

Если одна страница пытается заблокировать объект приложения, когда он уже заблокирован, она будет ждать, пока страница, удерживающая блокировку, не освободит его. Обычно это происходит быстро (код ASP обычно должен удерживать блокировку только на время, достаточное для доступа к общему объекту, хранящемуся в Application).

person Joe    schedule 04.10.2008