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

В некоторых учебниках asp, таких как это, я наблюдаю следующий шаблон:

Application.Lock

'do some things with the application object

Application.Unlock

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
627
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

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

Application.Lock

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

Application.Unlock

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

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

Ответ принят как подходящий

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

Метод 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 - без причитающихся кредитов.

Lumi 29.11.2011 04:12

Другие вопросы по теме