Чем отличается хранение объекта в Application и использование статических полей какого-нить класса. В случае с хранением объекта в Application нужно-ли синхронизировать методы, которые меняют внутреннее состояния объекта?
Здравствуйте, MaximVK, Вы писали:
MVK>Чем отличается хранение объекта в Application и использование статических полей какого-нить класса.
Зависит от того что за поле и какого именно класса.
MVK>В случае с хранением объекта в Application нужно-ли синхронизировать методы, которые меняют внутреннее состояния объекта?
Hello, "MaximVK" > Чем отличается хранение объекта в Application и использование статических полей какого-нить класса. В случае с хранением объекта в Application нужно-ли синхронизировать методы, которые меняют внутреннее состояния объекта?
Если имеется в виду использование класса HttpApplicationState, отличий практически нет. Если же имеется в виду хранение в одном из полей неследника HttpApplication, то стоит помнить, что экземпляры HttpApplication создаются инфраструктурой ASP.NET и их может быть несколько.
Posted via RSDN NNTP Server 1.6
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, Gollum, Вы писали:
G>Здравствуйте, MaximVK, Вы писали:
MVK>>Чем отличается хранение объекта в Application и использование статических полей какого-нить класса.
G>Зависит от того что за поле и какого именно класса.
MVK>>В случае с хранением объекта в Application нужно-ли синхронизировать методы, которые меняют внутреннее состояния объекта?
G>Да
Синхронизировать ничего не надо. Этим занимаеться HttpApplicationStateLock, построеныый на принципе ReaderWriterLock.
Здравствуйте, Mika Soukhov, Вы писали:
MS>Синхронизировать ничего не надо. Этим занимаеться HttpApplicationStateLock, построеныый на принципе ReaderWriterLock.
Да, но его надо явно вызывать. Например, вот так неправильно:
Dim i As Integer
i = CType(Application("Counter"), Integer)
i += 1
Application("Counter") = i
А вот так — правильно:
Dim i As Integer
Application.Lock()
i = CType(Application("Counter"), Integer)
i += 1
Application("Counter") = i
Application.UnLock()
В лучших книгах всегда нет имен, и в лучших картинах — лиц
Здравствуйте, Gollum, Вы писали:
G>Здравствуйте, Mika Soukhov, Вы писали:
MS>>Синхронизировать ничего не надо. Этим занимаеться HttpApplicationStateLock, построеныый на принципе ReaderWriterLock.
G>Да, но его надо явно вызывать. Например, вот так неправильно:
G>
G>Dim i As Integer
G>i = CType(Application("Counter"), Integer)
G>i += 1
G>Application("Counter") = i
G>
G>А вот так — правильно:
G>
G>Dim i As Integer
G>Application.Lock()
G>i = CType(Application("Counter"), Integer)
G>i += 1
G>Application("Counter") = i
G>Application.UnLock()
G>
Нет. Application.Lock() (в недрах будет вызываться _lock.AcquireWrite()) будет исполнен автоматически при операции Set.
Здравствуйте, Mika Soukhov, Вы писали:
MS>>>Синхронизировать ничего не надо. Этим занимаеться HttpApplicationStateLock, построеныый на принципе ReaderWriterLock.
G>>Да, но его надо явно вызывать. Например, вот так неправильно:
G>>
G>>Dim i As Integer
G>>i = CType(Application("Counter"), Integer)
G>>i += 1
G>>Application("Counter") = i
G>>
G>>А вот так — правильно:
G>>
G>>Dim i As Integer
G>>Application.Lock()
G>>i = CType(Application("Counter"), Integer)
G>>i += 1
G>>Application("Counter") = i
G>>Application.UnLock()
G>>
MS>Нет. Application.Lock() (в недрах будет вызываться _lock.AcquireWrite()) будет исполнен автоматически при операции Set.
то есть в этой строчке? :
Здравствуйте, Mika Soukhov, Вы писали:
MS>Нет. Application.Lock() (в недрах будет вызываться _lock.AcquireWrite()) будет исполнен автоматически при операции Set.
Пока не задекомпилировал сборку System.Web не поверил.
public void Set(string name, object value)
{
_lock.AcquireWrite();
try
{
base.BaseSet(name, value);
}
finally
{
_lock.ReleaseWrite();
}
}
public object Get(string name)
{
object local = null;
_lock.AcquireRead();
try
{
local = base.BaseGet(name);
}
finally
{
_lock.ReleaseRead();
}
return local;
}
public object this[string name]
{
get
{
return Get(name);
}
set
{
Set(name, value);
}
}
Здравствуйте, uzzy, Вы писали:
MS>>Нет. Application.Lock() (в недрах будет вызываться _lock.AcquireWrite()) будет исполнен автоматически при операции Set. U>то есть в этой строчке? : U>
U>Application("Counter") = i
U>
И тут, и при чтении тоже.
Мне звонили с открытия пленума — я сказал им, что я не приду
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, Gollum, Вы писали:
G>>А зачем они тогда в MSDN пишут, что надо лочить?
TK>Лочить надо, если нужно изменить несколько значений за один раз.
Насколько я понял, надо лочить все равно даже при изменении одного значения. К примеру:
Dim i As Integer
i = CType(Application("Counter"), Integer)
i += 1
Application("Counter") = i
Вызываются двумя параллельными процессами практически одновременно.
1-й процесс прочитал
i = CType(Application("Counter"), Integer)
и приступил к операции
i += 1 // предположим операция занимает длителньое время ~= 1 секунда напрмиер
2-й процесс за это время тоже успел прочесть начать i += 1
1-й процесс записал полученный результат
2-й процесс записал то же самое
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, uzzy, Вы писали:
U>>Насколько я понял, надо лочить все равно даже при изменении одного значения.
TK>В ситуации Application("x")++ — естественно нужно лочить руками.
то ли я в танке сегодня... то ли все-таки есть разница какая-то особая между
Application("x")++;
и
int i = (int) Application ("x");
i++;
Application ("x") = i;
Здравствуйте, uzzy, Вы писали:
U>>>Насколько я понял, надо лочить все равно даже при изменении одного значения. TK>>В ситуации Application("x")++ — естественно нужно лочить руками. U>то ли я в танке сегодня... то ли все-таки есть разница какая-то особая между
U>
Здравствуйте, mogadanez, Вы писали:
U>>то ли я в танке сегодня... то ли все-таки есть разница какая-то особая между
M>Видимо сегодня день танкиста.... M>ты, Gollum, я... больше трех — уже толпа
Надо еще одного найти, и собаку
Если кто-то про этот фильм еще помнит.
Здравствуйте, Gollum, Вы писали:
G>Здравствуйте, mogadanez, Вы писали:
U>>>то ли я в танке сегодня... то ли все-таки есть разница какая-то особая между
M>>Видимо сегодня день танкиста.... M>>ты, Gollum, я... больше трех — уже толпа
G>Надо еще одного найти, и собаку G>Если кто-то про этот фильм еще помнит.
помним... понмим, а еще было где-то "Три танкиста, три веселых друга"
Здравствуйте, uzzy, Вы писали:
TK>>В противном случае, когда веб сервер будет обрабатывать одновременно много запросов — можно потерять часть значений. U>значит Gollum был прав здесь