练习3:实现后台缓存
该练习将示范如何实现后台加载。
第一步
打开EmployeeBrowser.sln 项目,默认的安装路径应该为C:/Program Files/Microsoft Enterprise Library January 2006/labs/cs/Caching/exercises/ex03/begin,并编译。
第二步 实现后台加载
1
.在解决方案管理器中选择EmployeeServices.cs文件,选择View | Code菜单命令,添加如下两个方法,它们将实现在后台加载缓存。
方法使用一个委托在后台线程开始PopulateCache方法,它将会被.NET工作线程处理。
//
TODO: PopulateCache & BeginBackgroundLoad
private static void PopulateCache()
{
byte[] photoData = null;
EmployeesDataSet dsEmployees = GetContactDetails();
if (dsEmployees == null)
return;
CacheManager cache = CacheFactory.GetCacheManager();
foreach (EmployeesDataSet.EmployeesRow employee in dsEmployees.Employees)
{
if (!cache.Contains(employee.EmployeeID.ToString()))
{
EmployeeDataProvider dataProvider = new EmployeeDataProvider();
photoData = dataProvider.GetEmployeePhotoData(employee.EmployeeID);
cache.Add(employee.EmployeeID.ToString(), photoData);
}
}
}
private delegate void PopulateCacheDelegate();
public static void BeginBackgroundLoad()
{
if (!ConnectionManager.IsOnline)
return;
PopulateCacheDelegate mi = new PopulateCacheDelegate(PopulateCache);
mi.BeginInvoke(null, null);
}
private static void PopulateCache()
{
byte[] photoData = null;
EmployeesDataSet dsEmployees = GetContactDetails();
if (dsEmployees == null)
return;
CacheManager cache = CacheFactory.GetCacheManager();
foreach (EmployeesDataSet.EmployeesRow employee in dsEmployees.Employees)
{
if (!cache.Contains(employee.EmployeeID.ToString()))
{
EmployeeDataProvider dataProvider = new EmployeeDataProvider();
photoData = dataProvider.GetEmployeePhotoData(employee.EmployeeID);
cache.Add(employee.EmployeeID.ToString(), photoData);
}
}
}
private delegate void PopulateCacheDelegate();
public static void BeginBackgroundLoad()
{
if (!ConnectionManager.IsOnline)
return;
PopulateCacheDelegate mi = new PopulateCacheDelegate(PopulateCache);
mi.BeginInvoke(null, null);
}
BeginBackgroundLoad
2
.选择MainForm.cs文件,选择View | Code菜单命令,在方法MainForm_Load中加入如下代码开始后台工作。
private
void
MainForm_Load(
object
sender, EventArgs e)
{
this.ToolStripLabel1.Text = ConnectionManager.StatusText;
// Load data into the 'EmployeesDataSet'.
EmployeesDataSet tempDataset = EmployeeService.GetContactDetails();
if (tempDataset != null)
this.EmployeesDataSet.Merge(tempDataset);
// TODO: Start loading cache in the background
EmployeeService.BeginBackgroundLoad();
}
{
this.ToolStripLabel1.Text = ConnectionManager.StatusText;
// Load data into the 'EmployeesDataSet'.
EmployeesDataSet tempDataset = EmployeeService.GetContactDetails();
if (tempDataset != null)
this.EmployeesDataSet.Merge(tempDataset);
// TODO: Start loading cache in the background
EmployeeService.BeginBackgroundLoad();
}
第三步 运行应用程序
1
.选择Debug | Start Without Debugging菜单命令运行应用程序。
不要浏览任何雇员数据,在等待大概10秒后退出应用程序。如果应用程序在线它将尝试后台加载雇员照片,缓存存储在物理存储位置上,即持久缓存,但是与前一个练习使用了不同的PartitionName。
2
.在解决方案管理器中选择ConnectionManager.cs,选择View | Code菜单命令,在下面的代码中修改IsOnline属性的值。
.选择Debug | Start Without Debugging菜单命令运行应用程序。现在应用程序不再连接数据库处于离线状态,所有的雇员信息已经照片已经被缓存。
static
public
bool
IsOnline
{
get { return false; }
}
{
get { return false; }
}
3
更多Enterprise Library的文章请参考《Enterprise Library系列文章》