Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 666

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

 // Делегат для события CacheItemRemove.

 new CacheItemRemovedCallback(UpdateCarInventory));

Первые два параметра просто формируют пару "имя-значение" элемента. Третий параметр позволяет определить тип Cache Dependency (который в данном случае будет равен null, поскольку у вас в кэше нет элементов, зависящих от DataSet).

Замечание. Возможность определить тип 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,