Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步/等待和资源访问_C#_Async Await - Fatal编程技术网

C# 异步/等待和资源访问

C# 异步/等待和资源访问,c#,async-await,C#,Async Await,我想知道如何使用async/await很好地实现资源访问。我在web应用程序中有一个单例服务,它充当LDAP的代理,并且必须在第一次访问时缓冲所有数据——之后的所有调用都是通过缓存完成的,但在一段时间后缓存失效,应该再次获取数据。现在我的实现看起来像这样,但它不符合我的要求 public async Task<string> GetUserDisplayName(string username) { var users = await GetCac

我想知道如何使用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;
}
public异步任务GetUserDisplayName(字符串用户名)
{
var users=wait GetCachedUsers();
//使用缓存中的用户编写代码
}
专用异步任务GetCachedUsers()
{
var users=_Cache.Get();
如果(用户==null)
{
users=wait_Connector.GetAllUsers();
_添加(用户,TimeSpan.FromHours(用户\u缓存\u有效\u小时));
}
返回用户;
}

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

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

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