2017-12-21 17 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で一般的な結果を返します(私はViewModelで結果を正しくキャストできます)。

だから私はこの種の何かを行うことができます。

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、すべてのviewmodelが自分serviceCallsに渡すために利用でき、この一般的な方法を持っているということです。ビューのビジーインジケータにバインドするViewModelbaseにIsBusyプロパティがあります。私はサービスを呼び出す前にIsbusy = trueと実装したいとは思っていません。呼び出しが完了した後はIsBusy = falseになります。私がviewmodelBaseに汎用サービスメソッドを持っていれば、それをそこに張り付けることができ、自動的にどのviewmodelでも動作します:これはviewmodelbaseにエラーを格納するのと同じです。私はこの一般的な方法ですべてを扱いたい。任意のアイデアやアドバイス?

+0

なぜあなたのビューモデルの 'Login'はとにかく同期していますか?非同期コードを使用している場合は、非同期である必要があります。 – 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

関連する問題