取得にかなりの時間がかかるデータがあります。新しいデータをフェッチする必要があるかどうか、または現在の「キャッシュ」を使用できるかどうかを判断するには、さまざまな方法があります。theResult
誰かがそのデータを要求したときに、ブロッキングと非ブロッキングの両方のリターンを実行できるようにしたいと考えています。
それを行う最善の方法がわからないので、ManualResetEventSlim とロックを使用して何かを検討していました。
ノンブロッキング:
theState = State.None;
public Data GetDataNonBlocking(){
lock(_myLock){
if (theState == State.Getting)
return null;
if (theState == State.Complete
return theData;
theState = State.Getting;
_resetEvent.Reset();
Task.Factory.StartNew(
()=>{
//<...Getting data.....>
theData= ...data....;
lock(_myLock){
theState = State.Complete;
_resetevent.Set();
}
});
return null;
}
}
ブロッキング:
public Data GetDataBlocking(){
lock(_myLock){
if (theState == State.Getting){
_resetevent.Wait();
return theData;
}
if (theState == State.Complete)
return theData;
_resetevent.Reset();
theState = State.Getting;
}
//.....
theData= 1234;
lock(_myLock){
State = State.Complete;
_resetevent.Set();
}
return theData;
}
しかし、それがそのようなことをする方法であるとは確信していません。たとえば、_resetEvent.Wait()
内側のlock(...){}
?