通用任务方法实现

时间:2017-12-21 11:02:05

标签: c# generics mvvm task viewmodel

我有一个从ViewModelBase继承的ViewModel。 目前我在我的ViewModel中调用我的服务,如下所示:

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

在我的AuthenticarionService中,它看起来像这样:

  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
    }

现在我想要的是放置一个通用的Task方法,它将运行任何“awaitables”我传递给它并返回一个通用结果(我可以在我的viewmodel中正确地转换结果)在我的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的视图模型都可以通过这种通用方法传递其serviceCalls。 Viewmodelbase中有一个IsBusy属性,它绑定到视图上的忙指示符。我不喜欢在调用服务之前将其实现为Isbusy = true,并且在调用完成后将IsBusy = false。如果我在viewmodelBase中有一个通用服务方法,我可以将它粘贴在那里,它将自动为任何viewmodel工作:这与在viewmodelbase中存储错误相同。我想在这个通用方法中处理它。任何想法或建议?

1 个答案:

答案 0 :(得分:2)

如果您想要任何等待。

你可以做那样的事情

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

现在,你可以在T result = await task;之前和之后做任何你想做的事。