2017-12-21 3 views
0

ViewModelBase에서 상속받은 ViewModel이 있습니다. 현재 나는이처럼 내 ViewModel에 내 서비스를 호출 오전 : 내 AuthenticarionService에서일반 태스크 메서드 구현

private void Login(string _username, string _password) 
{ 
    Task.Run(async() => 
    { 
     var isLoginSuccess = await _authenticationDataService.Login(_username, _password); 
     if (isLoginSuccess == true) { } 
    }); 
} 

은 다음과 같습니다

public async Task<bool> Login(string username, string password) 
    { 
     Token = await GetAPIToken(username, password); 
     return true; 
    } 

    private static async Task<string> GetAPIToken(string userName, string password) 
    { 
     //Blah blah blah wont bore you with the detail 
    } 

이제 내가 원하는 하나를 실행 일반적인 작업 방법을 넣어하는 것입니다 "awaitables"나는 그것에 전달하고 내 ViewModelBase에서 일반적인 결과를 반환합니다 (필자의 뷰 모델에서 결과를 올바르게 캐스팅 할 수 있음).

그래서 이런 종류의 일을 할 수있는 :

private void Login(string _username, string _password) 
{ 
    var serviceCall = _authenticationDataService.Login(_username, _password);//Should not execute at this point yet 
    var loginSuccessfull = someTaskInMyViewModelBase(serviceCall); 

} 

여기 내 목표는 viewmodelbase을 inherites 모든 뷰 모델들이 serviceCalls 전달하기 위해 사용할 수있는이 일반적인 방법을 가지고있다. 뷰의 사용중 표시기에 바인딩하는 ViewModelbase에 IsBusy 속성이 있습니다. 그리고 서비스를 호출하기 전에 Isbusy = true로 구현하고 싶지 않습니다. 호출이 완료된 후 IsBusy = false입니다. viewmodelBase에 일반적인 서비스 메소드가 있다면 거기에 붙일 수 있으며 모든 viewmodel에 대해 자동으로 작동합니다. 이는 viewmodelbase에 오류를 저장하는 것과 동일합니다. 이 일반적인 방법으로 모든 것을 처리하고 싶습니다. 어떤 아이디어 또는 조언?

+0

보기 모델에서 '로그인'이 왜 동기화되어 있습니까? 비동기 코드를 사용하는 경우에는 비동기 적이어야합니다. – poke

+0

'Task '이 이미 제공 한 기능을 정확히 설명하지 않습니까? 귀하의 요구 사항을 감안할 때, 나는 추상화의 또 다른 층이 실제로 필요하다는 것을 알지 못합니다. – grek40

답변

1

을 사용하려면을 사용하십시오.

당신은 지금 당신은 당신이 이전과 T result = await task; 후 원하는대로 할 수

private async Task<T> RunTask<T>(Task<T> task) 
{ 
    T result = await task; 
    return result; 
} 

처럼 뭔가를 할 수 있습니다.

+0

감사합니다. 내가 원했던 것입니다. – user1702369