シームレスキャッシュ読み込みの簡略化:Lambda式のみの委任の転送
前に、シームレスなキャッシュ読み出し:2つのストレージアドレスを使用してキャッシュデータを交互に提供する2つのストレージキャッシュポリシーについて書きました.
2つのメモリポインタをシームレスにキャッシュを読み出すために変換し、Cat Chenの一言で注意した後、確かにキャッシュに2つのメモリポインタを使用する必要はありません.実際には、1つのメモリアドレスは、書き込み時に他のスレッドであれば保証されています.
ストレージメディアを次の2つのプロパティに変更します.
ここで、メモリ領域は、キャッシュするエンティティのコンテンツを格納するために使用され、IsUpdatingは、更新中であるかどうかを識別する.
キャッシュクラスでは、書き込みと読み取り方法が変更されます.
ここでは、追加時にプライマリスレッドに最初の書き込みキャッシュのみを制御し、読み出し時にキャッシュ内容を直接読み出す.
スレッド支援クラスも簡略化されており,それを実行して書き込むだけでよいので,放出スレッドはDictionaryCacheによって完全に制御される.
実は时には、自分の経験の方向に向かって自分のことを考えていることがあります.これは通常、問題を複雑にします.
庭の友达の助けがあって、やっと简単に问题を解决して、このような简単から繁まで、更に繁から简までの过程は実は実际に开発の中で発生したのは本当に少なくありません.
2つのメモリポインタをシームレスにキャッシュを読み出すために変換し、Cat Chenの一言で注意した後、確かにキャッシュに2つのメモリポインタを使用する必要はありません.実際には、1つのメモリアドレスは、書き込み時に他のスレッドであれば保証されています.
ストレージメディアを次の2つのプロパティに変更します.
namespace CHCache {
///
///
///
public class Medium {
///
///
///
public object Store { get; set; }
///
///
///
public bool IsUpdating { get; set; }
}
}
ここで、メモリ領域は、キャッシュするエンティティのコンテンツを格納するために使用され、IsUpdatingは、更新中であるかどうかを識別する.
キャッシュクラスでは、書き込みと読み取り方法が変更されます.
/*
* [url]http://www.cnblogs.com/chsword/[/url]
* 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;
}
}
}
実は时には、自分の経験の方向に向かって自分のことを考えていることがあります.これは通常、問題を複雑にします.
庭の友达の助けがあって、やっと简単に问题を解决して、このような简単から繁まで、更に繁から简までの过程は実は実际に开発の中で発生したのは本当に少なくありません.