Ich versuche, meine Cache aufzufüllen asynchronAsync Anruf innerhalb synchroner Funktion
static ConcurrentDictionary<string, string[]> data = new ConcurrentDictionary<string, string[]>();
public static async Task<string[]> GetStuffAsync(string key)
{
return data.GetOrAdd(key, async (x) => {
return await LoadAsync(x);
});
}
static async Task<string[]> LoadAsync(string key) {....}
aber das gibt mir den Fehler:
Cannot convert async lambda expression to delegate type 'System.Func'.
An async lambda expression may return void, Task or Task, none of which are convertible to 'System.Func'.
Wie ich verstehe dies, weil GetOrAdd()
nicht asynchron ist. Wie kann ich das Problem beheben?
Update: LazyAsync
vorgeschlagen in den Kommentaren wird in meinem triviales Beispiel arbeiten. Oder Abhilfe wie folgt aus (kann auf jeden Fall mit einem gewissen Aufwand leben es führt):
public static async Task<string[]> GetStuffAsync(string key)
{
string[] d = null;
if (!data.ContainsKey(key))
d = await LoadAsync(key);
return data.GetOrAdd(key, d);
}
Die Frage ist dann hat Microsoft haben einfach keine Zeit, um alle Schnittstellen zu aktualisieren unterstützen async oder ich versuche, etwas zutiefst falsch zu tun (und ConcurrentDictionary
sollte nicht GetOrAddAsync()
haben)?
keine Antwort, aber vielleicht interessant für Sie: haben Sie [AsyncLazy] (http://blogs.msdn.com/b/pfxteam/archive/2011/01/15/10116210.aspx) gesehen? – Default
Nun, Sie können es nicht mit der Schnittstelle, die Sie haben. 'await' funktioniert nur, wenn es sich um asynchrone Ebenen handelt, und Ihnen fehlt eine - die Methode' GetOrAdd' selbst. Sie würden eine Version benötigen, die selbst asynchron ist und auf die gesamte "GetOrAdd" -Methode wartet (beachten Sie, dass Sie das gerade nicht tun - das ist ein anderes Problem). Leider bedeutet dies, dass Sie Ihr eigenes ConcurrentDictionary schreiben müssen, was sehr schaden wird. – Luaan
Warum sollte 'ConcurrentDictionary'' GetOrAddAsync' haben? Es ist eine synchrone Speichererfassung. Es gibt keinen Grund dafür, eine solche Methode zu haben. –