通用任务方法实现

use*_*369 1 c# generics task mvvm viewmodel

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

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

在我的 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
    }
Run Code Online (Sandbox Code Playgroud)

现在我想要的是在我的 ViewModelBase 中放置一个通用的 Task 方法,它将运行我传递给它的任何“awaitables”并返回一个通用结果(我可以在我的视图模型中正确地转换结果)。

这样我就可以做这样的事情:

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

}
Run Code Online (Sandbox Code Playgroud)

我的目标是每个继承 viewmodelbase 的 viewmodel 都可以使用这个通用方法来传递它们的 serviceCalls。Viewmodelbase 中有一个 IsBusy 属性,它绑定到视图上的繁忙指示器。我不喜欢在调用服务之前将其实现为 Isbusy = true ,在调用完成后将其实现为 IsBusy = false 。如果我在 viewmodelBase 中有一个通用服务方法,我可以将其粘贴在那里,它将自动适用于任何 viewmodel:这对于在 viewmodelbase 中存储错误是相同的。我想用这个通用方法来处理这一切。有什么想法或建议吗?

小智 5

如果你想运行任何可等待的。

你可以做类似的事情

private async Task<T> RunTask<T>(Task<T> task)
{
    T result = await task;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

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