Чтение онлайн

на главную - закладки

Жанры

ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание

Троелсен Эндрю

Шрифт:

Замечание. Возможность определить тип CacheDependency довольно привлекательна. Например, можно указать зависимость между некоторым членом и внешним файлом, и если содержимое файла изменится, соответствующий тип автоматически обновится. Все подробности можно найти в документации .NET Framework 2.0.

Следующие три параметра используются для определения приоритета элемента и времени, в течение которого элементу позволяется оставаться в кэше приложения. Здесь указывается доступное только для чтения поле Cache.NoSlidingExpiration, которое указывает, что указанный промежуток времени (15 секунд) является абсолютным. Наконец, и это самое важное для данного

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

static void UpdateCarInventory(string key, object item, CacheItemRemovedReason reason) {…}

Теперь при запуске приложения тип DataSet будет заполнен и помещен в кэш. Каждые 15 секунд DataSet будет очищаться, обновляться и снова помещаться в кэш. Чтобы увидеть результат этих действий, мы должны создать тип Page, который будет позволять некоторую степень взаимодействия с пользователем.

Изменение файла *.aspx

Обновите пользовательский интерфейс исходного файла *.aspx так, как показано на рис. 24.4.

В обработчике события Load страницы настройте GridView на отображение содержимого помещенного в кэш типа DataSet при первом обращении пользователя к странице.

protected void Page_Load(object sender, EventArgs e) {

 if (!IsPostBack) {

carsGridView.DataSource = (DataSet)Cache["AppDataSet"];

carsGridView.DataBind;

 }

}

Рис. 24.4. Графический интерфейс пользователя для приложения с кэшированием

В обработчике события Click кнопки Добавить эту машину вставьте новую запись в базу данных Cars, используя для этого объект ADO.NET SqlCommand. После добавления записи вызовите вспомогательную функцию RefreshGrid, которая обновит интерфейс с помощью типа SqlDataReader (поэтому не забудьте указать using для пространства имен System.Data.SqlClient). Вот как должны выглядеть соответствующие методы,

protected void btnAddCar_Click(object sender, EventArgs e) {

 // Обновление таблицы Inventory

 // и вызов RefreshGrid.

 SqlConnection cn = new SqlConnection;

 cn.ConnectionString = "User ID=sa;Pwd=;Initial Catalog=Cars;Data Source=(local)";

 cn.Open;

 string sql;

 SqlCommand cmd;

 // Вставка нового Car.

 sql = string.Format(

"INSERT INTO Inventory(CarID, Make, Color, PetName) VALUES" +

"('{0}', '{1}', '{2} ', '{3}')",

txtCarID.Text, txtCarMake.Text,

txtCarColor.Text, txtCarPetName.Text);

 cmd = new SqlCommand(sql, cn);

 cmd.ExecuteNonQuery;

 cn.Close;

 RefreshGrid;

}

private void RefreshGrid {

 //
Заполнение таблицы.

 SqlConnection cn = new SqlConnection;

 cn.ConnectionString = "User ID=sa;Pwd=;Initial Catalog=Cars;Data Source=(local)";

 cn.Open;

 SqlCommand cmd = new SqlCommand("Select * from Inventory", cn);

 carsGridView.DataSource = cmd.ExecuteReader;

 carsGridView.DataBind;

 cn.Close;

}

Теперь, чтобы проверить использование кэша, запустите два экземпляра вашего Web-браузера и перейдите к этой странице *.aspx. Вы должны увидеть, что оба типа DataGrid отображают одинаковую информацию. В окне одного из экземпляров браузера добавьте новую машину. Очевидно, что в результате вы увидите обновленные данные GridView в окне браузера, который инициировал обращение к источнику данных.

Во втором экземпляре браузера щелкните на кнопке Обновить. Вы не увидите новый элемент, поскольку обработчик события Page_Load читает данные непосредственно из кэша. (Если же вы увидели новые данные, это значит, что уже истекли 15 секунд. Либо печатайте быстрее, либо увеличьте время, в течение которого тип DataSet должен оставаться в кэше.) Подождите несколько секунд и снова щелкните на кнопке Обновить второго экземпляра браузера. Теперь вы должны увидеть новые данные, поскольку время пребывания DataSet в кэше истекло, и целевой метод делегата CacheItemRemovedCallback автоматически обновил тип DataSet, помещенный в кэш.

Как видите, главное преимущество типа Cache заключается в том, что вы получаете возможность ответить на удаление члена. В этом примере вы, конечно, можете избежать использования типа Cache путем чтения данных в обработчике Page_Load непосредственно из базы данных Cars. Однако теперь вам должно быть ясно, что кэш позволяет автоматически обновлять данные с помощью делегатов .NET.

Замечание. В отличие от типа HttpApplicationState, класс Cache не поддерживает методы Lock и Unlock. Так что при необходимости обновить связанные элементы вам придется использовать типы из пространства имен System.Threading или ключевое слово lock C#.

Исходный код. Файлы примера CacheState размещены в подкаталоге, соответствующем главе 24.

Обработка сеансовых данных

Поговорив о данных уровня приложения, давайте перейдем к обсуждению данных, создаваемых на уровне пользователя. Как уже упоминалось, сеанс на самом деде представляет собой процесс взаимодействие пользователя с Web-приложением, представленный типом HttpSessionState. Для поддержки информации сеанса конкретного пользователя объект HttpApplication и любые другие типы System.Web.UI.Page могут использовать доступ к свойству Session. Классическим примером необходимости поддержки пользовательских данных является корзина покупателя: при подключении десятков посетителей к странице Интернет-магазина для каждого посетителя должен поддерживаться уникальный список товаров, которые этот посетитель собрался купить.

Поделиться:
Популярные книги

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода