用 Lambda表示式傳遞委託
在其中用了兩個儲存指標轉換以達到無縫讀取快取,在Cat Chen一語提醒之後,想了一想:的確是沒有必要在快取中使用兩個儲存指標的,其實一個儲存地址,只要保證寫入時在其它執行緒就可以。
更改儲存介質至以下兩個屬性:
namespace CHCache { ////// 快取介質 /// public class Medium { /// /// 儲存區 /// public object Store { get; set; } /// /// 是否正在更新 /// public bool IsUpdating { get; set; } } }
這裡儲存區用於儲存要快取的實體內容,而IsUpdating則標識其是否正在更新。
對於快取類,則更改了寫入和讀取方式。
/* * http://www.cnblogs.com/chsword/ * chsword * Date: 2009-3-31 * Time: 17:00 * */ using System; using System.Collections; using System.Collections.Generic; using System.Threading; namespace CHCache { ////// 雙儲存的類 /// public class DictionaryCache : IEnumerable { /// /// 在此快取構造時初始化字典物件 /// public DictionaryCache() { Store = new Dictionary<string, Medium>(); } public void Add(string key, Func<object> func) { if (Store.ContainsKey(key)) {
//修改,如果已經存在,再次新增時則採用其它執行緒 var elem = Store[key]; if (elem.IsUpdating) return;
//正在寫入未命中 var th = new ThreadHelper(elem, func); var td = new Thread(th.Doit); td.Start(); } else {//首次新增時可能也要讀取,所以要本執行緒執行 Console.WriteLine("Begin first write"); Store.Add(key, new Medium { Store = func() }); Console.WriteLine("End first write"); } } ////// 讀取時所用的索引 /// /// /// public object this[string key] { get { if (!Store.ContainsKey(key)) return null; var elem = Store[key]; return elem.Store; } } Dictionary<string, Medium> Store { get; set; } public IEnumerator GetEnumerator() { return ((IEnumerable)Store).GetEnumerator(); } } }
這裡在新增時只控制了首次寫入快取在主執行緒,而讀取時則直接讀取快取內容。
而執行緒輔助類也進行了簡化,僅將其執行並寫入就好了,丟擲執行緒完全由DictionaryCache控制。
using System; namespace CHCache { ////// 一個執行緒Helper,用於幫助多丟擲執行緒時傳遞引數 /// public class ThreadHelper { Func<object> Fun { get; set; } Medium Medium { get; set; } /// /// 通過建構函式來傳遞引數 /// /// /// public ThreadHelper(Medium m, Func<object> fun) { Medium = m; Fun = fun; } /// /// 執行緒入口,ThreadStart委託所對應的方法 /// public void Doit() { Medium.IsUpdating = true; Console.WriteLine("Begin write."); var ret = Fun.Invoke(); Medium.Store = ret; Console.WriteLine("End write."); Medium.IsUpdating = false; } } }
其實有的時候思考問題還是不由自主的向著自己的經驗方向刻意安排,這樣通常把問題搞複雜了。
還好有園子裡的朋友幫助,才簡單的解決了問題,這樣的由簡至繁,再由繁衍至簡的過程其實在實際開發中發生的還真不少。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-586875/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 委託、Lambda表示式、事件系列03,從委託到Lamda表示式事件
- 委託、Lambda表示式、事件系列07,使用EventHandler委託事件
- .NET委託,事件和Lambda表示式事件
- 委託、Lambda表示式、事件系列02,什麼時候該用委託事件
- C# 委託(delegate)、泛型委託和Lambda表示式C#泛型
- 委託、Lambda表示式、事件系列05,Action委託與閉包事件
- C# 委託,事件和Lambda表示式 (轉)C#事件
- 五分鐘重溫委託,匿名方法,Lambda,泛型委託,表示式樹泛型
- 委託、Lambda表示式、事件系列01,委託是什麼,委託的基本用法,委託的Method和Target屬性事件
- C#中的委託,匿名方法和Lambda表示式C#
- 五分鐘重溫C#委託,匿名方法,Lambda,泛型委託,表示式樹C#泛型
- 委託、Lambda表示式、事件系列04,委託鏈是怎樣形成的, 多播委託, 呼叫委託鏈方法,委託鏈異常處理事件
- C#快速入門教程(17)—— 委託、事件與Lambda表示式C#事件
- 委託、Lambda表示式、事件系列06,使用Action實現觀察者模式,體驗委託和事件的區別事件模式
- 基礎拾遺---委託,匿名函式,lambda函式
- Lambda 表示式的應用
- 【UNITY3D 遊戲開發之七】C# 中的委託、事件、匿名函式、Lambda 表示式Unity3D遊戲開發C#事件函式
- lambda表示式
- lambda 表示式
- Omi教程 - 傳遞javascript表示式JavaScript
- Java中Lambda表示式的應用Java
- Java | Lambda表示式Java
- Lambda表示式(Java)Java
- java lambda 表示式Java
- 八,Lambda表示式
- Java Lambda表示式Java
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- Lambda表示式基本語法與應用
- C# Lambda表示式詳解,及Lambda表示式樹的建立C#
- Python 如何傳遞運算表示式Python
- 淺談lambda表示式
- Lambda表示式詳解
- Java之lambda表示式Java
- kotlin lambda表示式Kotlin
- Python - lambda 表示式Python
- Lambda表示式總結
- Java的Lambda表示式Java
- Java 8 Lambda 表示式Java