我有一段需要花费大量时间才能获取的数据。我有不同的方法来确定是否应该获取新数据,或者我是否可以使用我当前的“缓存”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(...){}
?