天天看點

Winform裡面的緩存使用

緩存在很多情況下需要用到,合理利用緩存可以一方面可以提高程式的響應速度,同時可以減少對特定資源通路的壓力。本文主要針對自己在Winform方面的緩存使用做一個引導性的介紹,希望大家能夠從中了解一些緩存的使用場景和使用方法。緩存是一個中大型系統所必須考慮的問題。為了避免每次請求都去通路背景的資源(例如資料庫),我們一般會考慮将一些更新不是很頻繁的,可以重用的資料,通過一定的方式臨時地儲存起來,後續的請求根據情況可以直接通路這些儲存起來的資料。這種機制就是所謂的緩存機制。

.NET 4.0的緩存功能主要由三部分組成:System.Runtime.Caching,System.Web.Caching.Cache和Output Cache。

System.Runtime.Caching這是在.NET 4.0中新增的緩存架構,主要是使用MemoryCache對象,該對象存在于程式集System.Runtime.Caching.dll。

System.Web.Caching.Cache這個則是在.NET2.0開始就一直存在的緩存對象,一般主要用在Web中,當然也可以用于Winform裡面,不過要引用System.Web.dll。

Output Cache則是Asp.NET裡面使用的,在ASP.NET 4.0之前的版本都是直接使用System.Web.Caching.Cache來緩存HTML片段。在ASP.NET 4.0中對它進行了重新設計,提供了一個OutputCacheProvider供開發人員進行擴充,但是它預設情況下,仍然使用System.Web.Caching.Cache來做做緩存。

除了上面三種的緩存機制,一般我們還可以在靜态對象裡面通過HashTable或者Dictionary的方式進行自定義的緩存存儲和使用。

例如我在我自己所開發的程式裡面,都使用了工廠類來建立業務對象,由于建立業務對象以及資料通路層對象,是一個在界面或者中間層反複調用的操作,是以需要把經常調用的對象把它存儲起來,下載下傳調用的時候,直接從記憶體中取出來即可。如下面的BLLFactory類,就是一個基于泛型對象的業務類的建立操作,使用了基于Hashtable的靜态對象進行緩存處理。

2、使用.NET4.0的MemoryCache對象實作緩存

MemoryCache的使用網上介紹的不多,不過這個是.NET4.0新引入的緩存對象,估計主要是替換原來企業庫的緩存子產品,使得.NET的緩存可以無處不在,而不用基于特定的Windows版本上使用。

首先我們使用來建立一個基于MemoryCache的輔助類MemoryCacheHelper,友善調用進行緩存處理。

這個輔助類隻有一個public方法,就是GetCacheItem,使用的時候,需要指定key和擷取資料的處理代理,還有緩存的過期時間,是基于TimeSpan的還是基于絕對時間的,選擇其一。

上面的輔助類,我們在什麼情況下會使用到呢?

假如在一個工作流子產品中用到了人員ID,而人員ID需要進行人員名稱的轉義,人員資訊我們一般知道放在權限系統子產品裡面,那麼如果在工作流裡面需要頻繁對人員ID進行轉義,那麼就需要方法調用權限系統的接口子產品,這樣處理就可以使用緩存子產品進行優化處理的了。

其中的SecurityHelper.GetUserFullName是我對調用進行基于緩存的二次封裝,具體邏輯如下所示。

MemoryCacheHelper的方法GetCacheItem裡面的Func<T>我使用了一個匿名函數用來擷取緩存的值。

而調用BLLFactory<User>.Instance.GetFullNameByID則是從資料庫裡面擷取對應的資料了。

這樣在第一次或者緩存過期的時候,自動調用業務對象類的方法來擷取資料了。

最後,在界面上調用GetUserFullName的方法即可實作基于緩存方式的調用,程式第一次使用的,碰到指定的鍵沒有資料,就去資料庫裡面擷取,以後碰到該鍵,則直接擷取緩存的資料了。

下面圖形是程式具體的實作效果。

Winform裡面的緩存使用

當然,以上兩種方式都還可以通過AOP的注入方式實作代碼的簡化操作,不過由于對AOP的引入,會涉及到更多的知識點,而且熟悉程式還不夠,是以依然采用較為常用的方式來處理緩存的資料。