.NET ConcurrentDictionary GetOrAdd方法可以调用异步方法吗?

时间:2017-10-31 02:17:55

标签: c# .net asynchronous async-await concurrentdictionary

我正在考虑使用ConcurrentDictionary来保存一些来自慢速源(例如数据库)的缓存数据。

对数据库的调用是async。那么,如果项目不存在于字典中,是否可以让并发字典调用异步方法?

例如:

const int userId = 1;
var cachedUsers = new ConcurrentDictionary<int, Task<User>>();
var user = await cachedUsers.GetOrAdd(userId, val => GetSlowDbResultAsync(userId, cancellationToken));

所以上面的pseduo代码试图做的是:

  • 用户#1是否存在于C-Dict?
  • 是的,好的,使用它。
  • 不,从Db中抓取用户#1并将其粘贴在缓存中。

所以 - 将Task<User>放入并发字典的值&#39; (对于键/值):

  • 那可以吗?
  • 执行上面编写的代码,可接受的使用或者我只是滥用了async / await / c#
  • 所有的神圣内容

注意:

这个问题是inspired from my question on twitter 这类似于previous question I asked,但并没有太大的吸引力。

1 个答案:

答案 0 :(得分:-4)

如何尝试编写扩展方法,例如:

class Extension
{
    public static User Get(this ConcurrentDictionary<int, User> conDict, int userID)
    {
        User user = null;
        if (!conDict.TryGetValue(userID, out user))
        {
            user = GetSlowDbResultAsync(userId, cancellationToken)
           conDict.TryAdd(userID, user);
        }

        return user;
    }
}

有关扩展方法的详情,请查看此article