Async/await和资源访问

本文关键字:资源 访问 await Async | 更新日期: 2023-09-27 17:52:35

我想知道如何使用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下载应该只去一次。传统上我可以这样做并锁定资源,但线程将被阻塞,我希望它们以异步方式返回线程池,就像async/wait模式。

Async/await和资源访问

SemaphoreSlim有一个WaitAsync方法,可以让您在异步代码中创建临界区。您可以使用该信号量来防止对该方法的多次调用同时生成该值,而不会阻塞任何线程。