私は現在でビジネスレイヤで処理されている類似した要求の数を減らすためにしようとしている:キャッシュ要求(TPL?)
方法が遅いの実行- (すべての同様の要求のために1回)処理タスク各要求メソッドへ
- 戻る結果は注意することが
物事を呼び出して、あるもの:
- オリジナルのメソッド呼び出しがない現在非同期BeginMethod()/ ENDMETHOD(たIAsyncResult)
- でリクエストが、それは私が使用しようとしている出力
- を生成するのにかかる時間よりも早く到着しています可能であれば、私は現在このライブラリの詳細を学んでいるので、
たとえば、以下を改善する
byte[] RequestSlowOperation(string operationParameter)
{
Perform slow task here...
}
どのような考えですか?
はフォローアップ:
class SomeClass
{
private int _threadCount;
public SomeClass(int threadCount)
{
_threadCount = threadCount;
int parameter = 0;
var taskFactory = Task<int>.Factory;
for (int i = 0; i < threadCount; i++)
{
int i1 = i;
taskFactory
.StartNew(() => RequestSlowOperation(parameter))
.ContinueWith(result => Console.WriteLine("Result {0} : {1}", result.Result, i1));
}
}
private int RequestSlowOperation(int parameter)
{
Lazy<int> result2;
var result = _cacheMap.GetOrAdd(parameter, new Lazy<int>(() => RequestSlowOperation2(parameter))).Value;
//_cacheMap.TryRemove(parameter, out result2); <<<<< Thought I could remove immediately, but this causes blobby behaviour
return result;
}
static ConcurrentDictionary<int, Lazy<int>> _cacheMap = new ConcurrentDictionary<int, Lazy<int>>();
private int RequestSlowOperation2(int parameter)
{
Console.WriteLine("Evaluating");
Thread.Sleep(100);
return parameter;
}
}
なぜ 'Lazy'を使っているのですか?私は 'GetOrAdd()'に渡されたデリゲートは、そのキーの値がすでに存在する場合には実行されないと思います。 –
svick
これはロックを回避するものではないことに注意してください。複雑さを隠すデータ構造(ConcurrentDictionary)を使用しているだけです。 –
あなたの提案はかなり良いusrです。私はちょうど私のシナリオでこの辞書をきれいにする方法をチェックしています。ご意見をいただきありがとうございます。 – Westy