2016-06-28 117 views
0

我想知道如何使用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模式以異步方式返回到線程池。

回答

3

SemaphoreSlim有一個WaitAsync方法,可以讓你在異步代碼中創建關鍵部分。您可以使用該信號來防止方法的多次調用一起生成值,而不實際阻止任何線程。