Безопасен ли поток HttpApplicationState.RemoveAll()?

В моем asp.net приложение, я хочу кэшировать некоторые данные в HttpApplicationState,

Мой код для установки данных выглядит так:

 Application.Lock();

 Application.Set("Name", "Value");

 Application.UnLock();

Когда я читаю документацию, это говорит о том, что HttpApplicationState неявно потокобезопасен. Но на многих блогах написано, что мы должны использовать Application.Lock() а также Application.Unlock() во время записи данных в HttpApplicationState,

С другой стороны, я не смог найти никакой документации, которая говорит, что мы должны использовать блокировку при чтении данных из HttpApplicationState или во время очистки (используя Application.RemoveAll()) метод.

Мои вопросы:

  1. Разве мы не должны заботиться о безопасности потоков, когда мы звонимRemoveAll? В моем приложении возможно, что один поток читает данные из HttpApplicationState тогда как другой поток может вызвать RemoveAll,
  2. В этом случае при чтении и очистке 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 - Почему существует условие гонки, если оно потокобезопасно?

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