Ich bin neu in C# und versuche zu verstehen, wie man mit Lazy
arbeitet.Wie Lazy verwenden, um gleichzeitige Anfrage zu behandeln?
Ich muss gleichzeitige Anfrage behandeln, indem ich auf das Ergebnis einer bereits laufenden Operation warte. Datenanforderungen können gleichzeitig mit denselben/unterschiedlichen Anmeldeinformationen eingehen.
Für jeden eindeutigen Satz von Anmeldeinformationen gibt es höchstens einen GetDataInternal Anruf im Gang, mit dem Ergebnis sein kann, von dem ein Aufruf an alle Warteschlangen Kellner zurück, wenn es fertig ist
private readonly ConcurrentDictionary<Credential, Lazy<Data>> Cache
= new ConcurrentDictionary<Credential, Lazy<Data>>();
public Data GetData(Credential credential)
{
// This instance will be thrown away if a cached
// value with our "credential" key already exists.
Lazy<Data> newLazy = new Lazy<Data>(
() => GetDataInternal(credential),
LazyThreadSafetyMode.ExecutionAndPublication
);
Lazy<Data> lazy = Cache.GetOrAdd(credential, newLazy);
bool added = ReferenceEquals(newLazy, lazy); // If true, we won the race.
Data data;
try
{
// Wait for the GetDataInternal call to complete.
data = lazy.Value;
}
finally
{
// Only the thread which created the cache value
// is allowed to remove it, to prevent races.
if (added) {
Cache.TryRemove(credential, out lazy);
}
}
return data;
}
Ist das richtig zu nutzen Lazy
oder mein Code ist nicht sicher?
Update:
Ist es gute Idee, mit MemoryCache
statt ConcurrentDictionary
zu beginnen? Wenn ja, wie erstellt man einen Schlüsselwert, weil es ein string
innerhalb MemoryCache.Default.AddOrGetExisting()
Also, wenn ich 'faul' habe, kann ich nur' faul.Value' zurückgeben? Und nicht aus dem Cache entfernen –
Ja .___________ – usr
Wenn Sie 'PublicationOnly' verwenden, erhalten Sie möglicherweise keine Thread-Sicherheit für 'valueFactory', aber Ausnahmen werden nicht zwischengespeichert. –