在Web項目中可以使用Session,Application等來快取資料,也可以使用Cache來緩衝。
今天我們特別關注的是Cache緩衝。Cache位於命名空間System.Web.Caching命名空間下,看到這裡我們想到的是它在Web項目中使用。
說明:Cache 類不能在 ASP.NET 應用程式外使用。它是為在 ASP.NET 中用於為 Web 應用程式提供緩衝而設計和測試的。在其他類型的應用程式(如控制台應用程式或 Windows 表單應用程式)中,ASP.NET 緩衝可能無法正常工作。
下面看看一些Cache緩衝依賴的使用:
通過指定依賴項向緩衝添加項例子: 複製代碼 代碼如下:Cache.Insert("CacheItem2", "Cached Item 2");
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));
下面看看一個簡單的檔案依賴緩衝的使用,大家都知道Cache是支援檔案依賴緩衝的:
Cache.Insert("CacheItem4", "Cached Item 4", new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
下面是多依賴緩衝效果: 複製代碼 代碼如下:System.Web.Caching.CacheDependency dep1 = new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml"));
string[] keyDependencies2 = { "CacheItem1" };
System.Web.Caching.CacheDependency dep2 = new System.Web.Caching.CacheDependency(null, keyDependencies2);
System.Web.Caching.AggregateCacheDependency aggDep = new System.Web.Caching.AggregateCacheDependency();
aggDep.Add(dep1);
aggDep.Add(dep2);
Cache.Insert("CacheItem5", "Cached Item 5", aggDep);
通過上面的這些代碼,基本知道Cache一些依賴緩衝方面的用法,也達到了我們最初想要的結果。下面通過一個完整的例子來看看Cache檔案依賴緩衝的使用。
首先定義一個XML檔案,其檔案內容如下 並附帶一個實體類: 複製代碼 代碼如下:<?xml version="1.0" encoding="utf-8" ?>
<Students>
<Student>
<Name>hechen</Name>
<Sex>男</Sex>
<Age>23</Age>
</Student>
<Student>
<Name>情緣</Name>
<Sex>男</Sex>
<Age>23</Age>
</Student>
</Students>
定義一個讀取上面xml檔案的類: 複製代碼 代碼如下:public class AccessProvider
{
public AccessProvider()
{
}
public List<Student> GetStudentList(string filePath)
{
XElement root = XElement.Load(filePath);
IEnumerable<XElement> enumerable = from e in root.Elements("Student") select e;
List<Student> list = new List<Student>();
Student student = null;
foreach (XElement element in enumerable)
{
student = new Student();
student.Name = element.Element("Name").Value;
student.Age = Convert.ToInt32(element.Element("Age").Value);
student.Sex = element.Element("Sex").Value;
list.Add(student);
}
return list;
}
}
讀取緩衝並設定檔案快取依賴: 複製代碼 代碼如下:public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<Student> list = Cache["Items1"] as List<Student>;
if (list != null && list.Count>0)
{
list.ForEach(item => { Response.Write(item.Name + " " + item.Age + " "+item.Sex+"<br/>"); });
}
else
{
AccessProvider provider = new AccessProvider();
string fielPath = Server.MapPath("~/Xml/Student.xml");
list = provider.GetStudentList(fielPath);
Cache.Insert("Items1", list, new System.Web.Caching.CacheDependency(fielPath));
}
}
}
後面將上傳這個例子,運行頁面之後,可以人工去修改上述定義的xml檔案,然後重新整理頁面看看效果。當你修改過此檔案之後,緩衝內容就會失效 然後重新去讀取xml檔案內容再次緩衝。這裡代碼不做過多的解釋。
Cache 只能用作Web相聚,那如果遇到Console項目 以及WinForm等其他項目怎麼辦,沒有了依賴緩衝,我們該如何去解決這個問題。下面我們來看看如何?一個檔案依賴緩衝。
目標:實現當某個特定檔案夾下的檔案被修改 刪除 或添加使得系統中的緩衝失效或者重新載入緩衝。
程式類型: WinForm程式 Web程式 Console程式
我們使用最為簡單的Console程式作為例子,這個最具有通用性。
首先這裡自訂一個緩衝對象: 複製代碼 代碼如下:namespace CacheConsole
{
public class Cache
{
private static int Num=50;
private static object obj = new object();
static Cache()
{
}
public static int Get()
{
return Num;
}
public static void Update(int argValue)
{
lock (obj)
{
Num = argValue;
}
}
}
}
上面的緩衝其實就是一個用Static 修飾的全域變數,其中定義了一個快取資料擷取的方法和一個緩衝更新的方法,靜態變數Num作為一個緩衝容器,預設初始值為50.這個緩衝容器雖然簡單了點,但是也能夠達到我們的要求。
假設我們程式依賴的檔案位於F:\File\ 目錄下面,所以我們要去監控這些檔案,實現監控更新緩衝的代碼如下: 複製代碼 代碼如下:private static void Run()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"F:\File\";
watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastAccess | NotifyFilters.Size;
watcher.Filter = "*.txt";
watcher.Created += delegate(object source, FileSystemEventArgs e) { Console.WriteLine("建立新的檔案:" + DateTime.Now.ToString()); Cache.Update(10); };
watcher.Changed += delegate(object source, FileSystemEventArgs e) { Console.WriteLine("檔案修改:" + DateTime.Now.ToString()); Cache.Update(20); };
watcher.Deleted += delegate(object source, FileSystemEventArgs e) { Console.WriteLine("檔案刪除:" + DateTime.Now.ToString()); Cache.Update(30); };
watcher.Renamed += delegate(object source, RenamedEventArgs e) { Console.WriteLine("檔案重新命名:" + DateTime.Now.ToString()); Cache.Update(40); };
watcher.EnableRaisingEvents = true;
}
這個程式監聽了特定目錄下的檔案建立,修改 ,刪除,以及重新命名。注意這裡程式過濾了只監聽.txt檔案。
然後我們用用一個程式去不但讀取快取資料 複製代碼 代碼如下:static void Main(string[] args)
{
Run();
for (int i = 1; i <= 10000; i++)
{
int value = Cache.Get();
Console.WriteLine("第"+i+"次取值: "+value);
Thread.Sleep(3000);
}
}
開機檔案的監聽,然後不但得讀取快取資料。運行效果如下:
對檔案不做任何修改的情況下運行效果:
對檔案的建立運行如下:
對檔案重新命名的效果如下:
對檔案內容的修改運行效果如下:
對檔案系統刪除運行效果如下:
從上面的圖可以看出,每次對這個檔案目錄中的txt檔案作修改都會造成快取資料的更新,這個也就達到了我們最初的目的。這些快取資料依賴這些檔案系統。
到這裡大家可能都認為這是廢話,寫了這麼多,其實內容很簡單,作為一個小知識點分享一下。具體可以看看 FileSystemWatcher 類的使用。
範例程式碼 下載