2016-06-28 5 views
0

async/await를 사용하여 리소스 액세스를 잘 구현하는 방법을 알고 싶습니다. 나는 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 메서드가있어 비동기 코드에서 중요한 섹션을 만들 수 있습니다. 이 세마포어를 사용하면 실제로 스레드를 차단하지 않고도 메소드를 여러 번 호출하여 값을 생성하지 않도록 할 수 있습니다.