protected void Page_Load(Object Sender, EventArgs e,)
{
  int count = (int)Application["HitCounterForOrderPage"];
  count++;
  Application["HitCounterForOrderPage"] = count;
  lblCounter.Text = count.ToString();
}

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

Состояние приложения применяется редко, потому что, как правило, является неэффективным. В предыдущем примере счетчик вряд ли бы всегда отображал точное значение, особенно при насыщенном трафике. Например, в случаел если бы одну и ту же страницу одновременно запросили сразу два пользователя, последовательность событий выглядела бы так:

  1. Пользователь А извлекает текущее значение счетчика (432).
  2. Пользователь В извлекает текущее значение счетчика (432).
  3. Пользователь А устанавливает для счетчика значение 433.
  4. Пользователь В устанавливает для счетчика значение 433.

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

protected void Page_Load(Object sender, EventArgs. e)
{
  // Запрашиваем монопольный доступ.
  Application.Lock();
  int count = (int)Application["HitCounterForOrderPage"];
  count++;
  Application["HitCounterForOrderPage"] = count;
  // Отключаем монопольный доступ.
  Application.Unlock();
  lblCounter.Text = count.ToString();
}

К сожалению, все остальные клиенты, запрашивающие эту страницу, теперь будут задерживаться (то есть, вынуждены будут ожидать) до тех пор, пока коллекция Application не освободится. Это может значительно снизить производительность. Вообще говоря, значения, которые изменяются часто, в состоянии приложения лучше не сохранить. На самом деле, состояние приложения сейчас редко используется в мире .NET, потому что в двух основных случаях, когда раньше применялась эта коллекция, теперь могут использоваться более простые и более эффективные подходы:

предыдущая    следующая страница   оглавление

291

Hosted by uCoz