异步/等待和资源访问

时间:2016-06-28 16:07:14

标签: c# async-await

我想知道如何使用async / await很好地实现资源访问。我在Web应用程序中有单一服务,它充当LDAP的代理,并且必须在第一次访问时缓冲所有数据 - 之后的所有调用都是通过缓存完成的,但是在一段时间后缓存失效并且数据应该再次获取。现在我的实现看起来像这样,但它不符合我的要求

public async Task<string> GetUserDisplayName(string username)
       {
           var users = await GetCachedUsers();

           // code using users from cache
       }

private async Task<IEnumerable<LdapUser>> GetCachedUsers()
{
     var users = _Cache.Get<IEnumerable<LdapUser>>();

     if (users == null)
     {
         users = await _Connector.GetAllUsers();

         _Cache.Add(users, TimeSpan.FromHours(USER_CACHE_VALID_HOURS));
     }


    return users;
}

我想知道如何以这种方式实现这一点,当夫妇请求第一次去服务时,他们应该在同一个任务上等待,但是没有阻止,从LDAP下载应该只进行一次。我可以传统地执行此操作并锁定资源,但线程将被阻止,我希望它们以异步方式返回到线程池,就像在异步/等待模式中一样。

1 个答案:

答案 0 :(得分:3)

SemaphoreSlim有一个WaitAsync方法,可以让您在异步代码中创建一个关键部分。您可以使用该信号量来防止方法的多次调用一起生成值,而不会实际阻塞任何线程。