Ich habe ein Stück Daten, die ziemlich viel Zeit zum Abrufen dauert. Ich habe verschiedene Möglichkeiten, herauszufinden, ob neue Daten geholt werden sollen oder ob ich meinen aktuellen "Cache" verwenden kann. theResult
Wenn jemand nach diesem Datenelement fragt, kann ich sowohl eine blockierende als auch eine blockierungsfreie Rückkehr durchführen.ManualResetEventSlim und Lock
Ich bin nicht sicher, was der beste Weg, das zu tun ist, ich erwäge etwas mit ManualResetEventSlim und eine Sperre:
NonBlocking:
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;
}
}
Blocking:
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;
}
Aber ich bin mir nicht sicher, ob das so ist. Zum Beispiel die _resetEvent.Wait()
innerhalb einer lock(...){}
?
Oder, wenn in .NET 4.0, die 'Task' Klasse. –
casperOne