У меня есть private ConcurrentDictionary
, который представляет собой простую таблицу поиска некоторых ключей БД.Как сохранить результат метода async в .NET ConcurrentDictionary при вызове GetOrAdd?
Я пытаюсь использовать ConcurrentDictionary
так, чтобы он выполнял только один вызов в db, когда запросы 2+ к одной и той же строке кода выполняются одновременно. (Вот почему я использую ConcurrentDictionary
.)
Как я могу это сделать, пожалуйста?
Это то, что я пытается делать .. но я думаю, что это хранение Task
в словаре ... не результат задачи ....
private readonly ConcurrentDictionary<string, Task<int>> _myKeys = new ConcurrentDictionary<string, Task<int>>();
...
private async Task<int> DoStuffAsync(string key)
{
// do stuff here.
return await _myKeys.GetOrAdd(key,
async k => await _db.GetId(k)
.ConfigureAwait(false))
.ConfigureAwait(false);
}
Любые идеи ?
EDIT:
Обратите внимание мой метод подписи и то, что я возвращаюсь. Лучше ли возвращать int
, а не Task<int>
, а затем как-то реорганизовать мой вызов db, чтобы все еще быть асинхронным .. но .. лучше?
Что случилось с сохранением задачи в словаре? –
Люди, которые голосуют, чтобы закрыть или downvoting, пожалуйста, объясните, почему, чтобы улучшить Q. –
@StephenCleary Я не был уверен, что это было хорошо или плохо. Это было похоже на объект _heavy_ для хранения, когда результатом будет просто 'int'. –