亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

asp.net開(kāi)發(fā)中怎樣去突破文件依賴緩存

 更新時(shí)間:2011年07月07日 12:18:39   作者:  
緩存大家用的太多了,簡(jiǎn)單至一個(gè)用static修飾的變量都可以視作緩存,復(fù)雜至Memcached等大數(shù)據(jù)量的緩存。
在Web項(xiàng)目中可以使用Session,Application等來(lái)緩存數(shù)據(jù),也可以使用Cache來(lái)緩存。

今天我們特別關(guān)注的是Cache緩存。Cache位于命名空間System.Web.Caching命名空間下,看到這里我們想到的是它在Web項(xiàng)目中使用。

說(shuō)明:Cache 類不能在 ASP.NET 應(yīng)用程序外使用。它是為在 ASP.NET 中用于為 Web 應(yīng)用程序提供緩存而設(shè)計(jì)和測(cè)試的。在其他類型的應(yīng)用程序(如控制臺(tái)應(yīng)用程序或 Windows 窗體應(yīng)用程序)中,ASP.NET 緩存可能無(wú)法正常工作。

下面看看一些Cache緩存依賴的使用:

通過(guò)指定依賴項(xiàng)向緩存添加項(xiàng)例子:
復(fù)制代碼 代碼如下:

Cache.Insert("CacheItem2", "Cached Item 2");
string[] dependencies = { "CacheItem2" };
Cache.Insert("CacheItem3", "Cached Item 3",
new System.Web.Caching.CacheDependency(null, dependencies));

下面看看一個(gè)簡(jiǎn)單的文件依賴緩存的使用,大家都知道Cache是支持文件依賴緩存的:
Cache.Insert("CacheItem4", "Cached Item 4", new System.Web.Caching.CacheDependency(Server.MapPath("XMLFile.xml")));
下面是多依賴緩存效果:
復(fù)制代碼 代碼如下:

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);

通過(guò)上面的這些代碼,基本知道Cache一些依賴緩存方面的用法,也達(dá)到了我們最初想要的結(jié)果。下面通過(guò)一個(gè)完整的例子來(lái)看看Cache文件依賴緩存的使用。
首先定義一個(gè)XML文件,其文件內(nèi)容如下 并附帶一個(gè)實(shí)體類:
復(fù)制代碼 代碼如下:

<?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>

定義一個(gè)讀取上面xml文件的類:
復(fù)制代碼 代碼如下:

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;
}
}

讀取緩存并設(shè)定文件緩存依賴:
復(fù)制代碼 代碼如下:

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 + "&nbsp;&nbsp;" + item.Age + "&nbsp;&nbsp;"+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));
}
}
}

后面將上傳這個(gè)例子,運(yùn)行頁(yè)面之后,可以人工去修改上述定義的xml文件,然后刷新頁(yè)面看看效果。當(dāng)你修改過(guò)此文件之后,緩存內(nèi)容就會(huì)失效 然后重新去讀取xml文件內(nèi)容再次緩存。這里代碼不做過(guò)多的解釋。
Cache 只能用作Web相聚,那如果遇到Console項(xiàng)目 以及WinForm等其他項(xiàng)目怎么辦,沒(méi)有了依賴緩存,我們?cè)撊绾稳ソ鉀Q這個(gè)問(wèn)題。下面我們來(lái)看看如何實(shí)現(xiàn)一個(gè)文件依賴緩存。
目標(biāo):實(shí)現(xiàn)當(dāng)某個(gè)特定文件夾下的文件被修改 刪除 或添加使得系統(tǒng)中的緩存失效或者重新加載緩存。
程序類型: WinForm程序 Web程序 Console程序
我們使用最為簡(jiǎn)單的Console程序作為例子,這個(gè)最具有通用性。
首先這里自定義一個(gè)緩存對(duì)象:
復(fù)制代碼 代碼如下:

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;
}
}
}
}

上面的緩存其實(shí)就是一個(gè)用Static 修飾的全局變量,其中定義了一個(gè)緩存數(shù)據(jù)獲取的方法和一個(gè)緩存更新的方法,靜態(tài)變量Num作為一個(gè)緩存容器,默認(rèn)初始值為50.這個(gè)緩存容器雖然簡(jiǎn)單了點(diǎn),但是也能夠達(dá)到我們的要求。
假設(shè)我們程序依賴的文件位于F:\File\ 目錄下面,所以我們要去監(jiān)控這些文件,實(shí)現(xiàn)監(jiān)控更新緩存的代碼如下:
復(fù)制代碼 代碼如下:

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("創(chuàng)建新的文件:" + 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;
}

這個(gè)程序監(jiān)聽(tīng)了特定目錄下的文件創(chuàng)建,修改 ,刪除,以及重命名。注意這里程序過(guò)濾了只監(jiān)聽(tīng).txt文件。
然后我們用用一個(gè)程序去不但讀取緩存數(shù)據(jù)
復(fù)制代碼 代碼如下:

static void Main(string[] args)
{
Run();
for (int i = 1; i <= 10000; i++)
{
int value = Cache.Get();
Console.WriteLine("第"+i+"次取值: "+value);
Thread.Sleep(3000);
}
}

啟動(dòng)文件的監(jiān)聽(tīng),然后不但得讀取緩存數(shù)據(jù)。運(yùn)行效果如下:

對(duì)文件不做任何修改的情況下運(yùn)行效果:

 

對(duì)文件的創(chuàng)建運(yùn)行效果圖如下:

 

對(duì)文件重命名的效果如下:

 

對(duì)文件內(nèi)容的修改運(yùn)行效果如下:

 

對(duì)文件系統(tǒng)刪除運(yùn)行效果如下:

 

從上面的圖可以看出,每次對(duì)這個(gè)文件目錄中的txt文件作修改都會(huì)造成緩存數(shù)據(jù)的更新,這個(gè)也就達(dá)到了我們最初的目的。這些緩存數(shù)據(jù)依賴這些文件系統(tǒng)。

到這里大家可能都認(rèn)為這是廢話,寫了這么多,其實(shí)內(nèi)容很簡(jiǎn)單,作為一個(gè)小知識(shí)點(diǎn)分享一下。具體可以看看 FileSystemWatcher 類的使用。

示例代碼 下載

相關(guān)文章

  • .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    .Net Core路由處理的知識(shí)點(diǎn)與方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于.Net Core路由處理的知識(shí)點(diǎn)與方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 詳述ASP.Net中頁(yè)面之間傳參方法

    詳述ASP.Net中頁(yè)面之間傳參方法

    本文主要詳述ASP.NET中頁(yè)面之間傳遞參數(shù)的方法,共介紹了三種方法,有需要的朋友可以來(lái)了解一下。
    2016-10-10
  • .Net Core中ObjectPool的使用與源碼解析

    .Net Core中ObjectPool的使用與源碼解析

    這篇文章主要給大家介紹了關(guān)于.Net Core中ObjectPool的使用與源碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用.Net Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • asp.net開(kāi)發(fā)中常見(jiàn)公共捕獲異常方式總結(jié)(附源碼)

    asp.net開(kāi)發(fā)中常見(jiàn)公共捕獲異常方式總結(jié)(附源碼)

    這篇文章主要介紹了asp.net開(kāi)發(fā)中常見(jiàn)公共捕獲異常方式總結(jié),結(jié)合實(shí)例形式較為詳細(xì)的分析了asp.net捕獲異常的相關(guān)技巧,并提供了完整的實(shí)例代碼供讀者下載參考,需要的朋友可以參考下
    2015-11-11
  • 如何判斷?.NET?Core?應(yīng)用程序以管理員身份運(yùn)行的

    如何判斷?.NET?Core?應(yīng)用程序以管理員身份運(yùn)行的

    這篇文章主要介紹了如何判斷?.NET?Core?應(yīng)用程序是以管理員身份運(yùn)行的,我們需要知道當(dāng)前程序是否以管理員身份運(yùn)行,以便執(zhí)行一些需要特殊權(quán)限的操作,下面為我們就來(lái)學(xué)習(xí)具體的方法吧,需要的朋友可以參考一下
    2022-03-03
  • ASP.NETWeb服務(wù)器驗(yàn)證控件如何使用

    ASP.NETWeb服務(wù)器驗(yàn)證控件如何使用

    這篇文章主要介紹了ASP.NETWeb服務(wù)器驗(yàn)證控件如何使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • 數(shù)據(jù)庫(kù)開(kāi)發(fā)總結(jié)(ADO.NET小結(jié))

    數(shù)據(jù)庫(kù)開(kāi)發(fā)總結(jié)(ADO.NET小結(jié))

    數(shù)據(jù)庫(kù)開(kāi)發(fā)總結(jié)(ADO.NET小結(jié))...
    2006-12-12
  • .NET MD5加密解密代碼解析

    .NET MD5加密解密代碼解析

    這篇文章主要為大家詳細(xì)解析了.NET MD5加密解密代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • .NET Core使用Topshelf方式創(chuàng)建Windows服務(wù)的全過(guò)程記錄

    .NET Core使用Topshelf方式創(chuàng)建Windows服務(wù)的全過(guò)程記錄

    這篇文章主要給大家介紹了關(guān)于.NET Core使用Topshelf方式創(chuàng)建Windows服務(wù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • .Net頁(yè)面局部更新引發(fā)的思考

    .Net頁(yè)面局部更新引發(fā)的思考

    這篇文章主要是由.Net頁(yè)面局部更新引發(fā)的一系列思考,整理了實(shí)現(xiàn)局部更新的解決方案及改進(jìn)方案,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評(píng)論