Безопасен ли поток HttpApplicationState.RemoveAll()?
В моем asp.net
приложение, я хочу кэшировать некоторые данные в HttpApplicationState
,
Мой код для установки данных выглядит так:
Application.Lock();
Application.Set("Name", "Value");
Application.UnLock();
Когда я читаю документацию, это говорит о том, что HttpApplicationState
неявно потокобезопасен. Но на многих блогах написано, что мы должны использовать Application.Lock()
а также Application.Unlock()
во время записи данных в HttpApplicationState
,
С другой стороны, я не смог найти никакой документации, которая говорит, что мы должны использовать блокировку при чтении данных из HttpApplicationState
или во время очистки (используя Application.RemoveAll()
) метод.
Мои вопросы:
- Разве мы не должны заботиться о безопасности потоков, когда мы звоним
RemoveAll
? В моем приложении возможно, что один поток читает данные изHttpApplicationState
тогда как другой поток может вызватьRemoveAll
, - В этом случае при чтении и очистке
HttpApplicationState
возможно из двух разных потоков одновременно, должно ли чтение тоже не быть потокобезопасным?
2 ответа
Блокировка необходима только в том случае, если вы выполняете более одной операции с состоянием приложения. В вашем случае вы просто делаете одну операцию, поэтому без блокировки это совершенно безопасно:
Application.Set("Name", "Value");
Если вы выполняете более одной операции, и они зависят друг от друга, вам нужна блокировка. Например:
Application.Lock();
string name = Application.Get("Name");
if (name == null) {
Application.Set("Name", "Value");
}
Application.UnLock();
Насколько я могу судить, RemoveAll является потокобезопасным, поскольку он вызывает метод Clear внутри. Метод Clear вызывает HttpApplicationStateLock.AcquireWrite, а затем вызывает base.BaseClear и, наконец, снимает блокировку.
Также взгляните на HttpApplicationState - Почему существует условие гонки, если оно потокобезопасно?