2014-10-19 3 views
0

그래서 내 기본 컨트롤러에이 방법을 호출 awaitable 메소드 LoginAsync입니다. 메소드를 제대로 기다리고 있는지 확인하고 싶습니다.전파 비동기/기다리고 있습니다 방법은

내 생각 프로세스는 다음과 같습니다

  1. LoginAsyncTask<bool> 때문에 Func가를 반환하는 반환합니다.
  2. 전달할 때 await 할 수 있으므로 그렇게하십시오. ExecuteSimpleQuery 내부 Task<bool> 당신이 거기 awaitFunc 반환하기 때문에
  3. , 그렇게해야
  4. ExecuteSimpleQuery 따라서 async 키워드를 가지고 있어야하기 때문에 Task<T>을 반환해야하고, 방법을 기다리고있다.
  5. 마지막 점은 Login 동작으로 전파되므로 해당 메서드는 Task<T>을 반환하므로 기다려야합니다.

나는 닫을 까?

+0

왜 그렇게 복잡합니까? 누가'ExecuteSimpleQuery'에 로그인 호출을 위임합니까? –

+0

서비스 기반 아키텍쳐를 사용하여 나는 서비스를 호출하는 정말 일관된 방법을 가지고 있습니다. 그래서 항상'try ... catch'를 써야하는 대신, 한번 쓰고 똑같이 처리합니다. 그냥 쉽고 덜 지루해. –

답변

2

이렇게하면됩니다. 조금 단순화 할 수 있습니다 LoginAsync 이미 Task을 반환하기 때문에

async() => await this.securityService.LoginAsync(register.UserName, register.Password, true) 

() => this.securityService.LoginAsync(register.UserName, register.Password, true) 

로 기록 될 수있다. 항상 작업을 기다릴 때마다 작업을 처리 할 때마다 일정한 일관성이 있습니다. 당신이했던 것처럼이 일을 마무리하는 것은 실제로 해가되지 않습니다. 두 가지 방법이 모두 합리적이라고 생각합니다.

LoginAsync은 아무런 예외도 발생시킬 수 없으므로 (맘에 든다) 람다가 전혀 필요하지 않습니다. 예외는 일반적으로 비동기 메서드를 호출 할 때 Task에 저장됩니다. TaskExecuteSimpleQuery으로 직접 보낼 수 있습니다. LoginAsync이이 패턴을 따르지 않으면 예외가 너무 일찍 트리거되므로이를 수행 할 수 없습니다.

var loginTask = securityService.LoginAsync(register.UserName, register.Password, true); 
    var objectStore = await ExecuteSimpleQuery(loginTask); 

protected async Task<KeyValuePair<bool, string>> ExecuteSimpleQuery(Task<bool> service) 
{ 
    //... 

    try 
    { 
     success = await service; 
    } 
    catch (Exception exception) 
    { 
     //... 
    } 

    //... 
} 

당신은 말을하여이를 테스트 할 수 있습니다

var loginTask = Task.Run(() => { throw null; }); 

catch이 타격을받을 것입니다.