ASP NET MVC 5任务异步创建异步方法

Cal*_*ton 1 .net c# asp.net asp.net-mvc asynchronous

所以我只想制作我的服务层async.

我有一个新服务ProjectManagement,我希望它的GetProjects方法是异步的.

public Task<string> GetProjectsAsync()
{
    var json = JsonConvert.SerializeObject(_repository.All<Projects>());

    return json;
}
Run Code Online (Sandbox Code Playgroud)

我知道这种方法不起作用,显然是因为我返回一个字符串,而不是一个字符串Task<string>.那么我如何使用Task.Run()运行此方法并返回结果?

我看过这个文档,我对如何使用它有点困惑?

我希望能够在我的控制器中执行的操作是:

var jsonData = await _projectManagement.GetProjectsAsync();
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

转换为时async,您希望从"离开"开始,并朝着您的控制器/ UI工作.我做了很多转换,这是我发现的最佳方法.

因此,首先要确定任何自然异步的操作; 任何I/O限制都是一个不错的选择.您已经确定了一个:数据库调用.

接下来,从最低级别的代码开始,并使其异步.这就是你的问题所在; 你正在考虑通过使用来强制中间异步Task.Run,但是你需要深入到较低级别并使其一直异步.

例如,我假设您的存储库正在使用Entity Framework,并且您的All<T>方法看起来像这样:

public List<T> All<T>()
{
  return _context.Set<T>().ToList();
}
Run Code Online (Sandbox Code Playgroud)

然后,您将开始创建此存储库方法的异步版本:

public Task<List<T>> AllAsync<T>()
{
  return _context.Set<T>().ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)

一旦你有至少一个异步存储库方法,你就可以开始将服务层更改为异步,所以这段代码:

public string GetProjects()
{
  var json = JsonConvert.SerializeObject(_repository.All<Projects>());
  return json;
}
Run Code Online (Sandbox Code Playgroud)

成为这个:

public async Task<string> GetProjectsAsync()
{
  var json = JsonConvert.SerializeObject(await _repository.AllAsync<Projects>());
  return json;
}
Run Code Online (Sandbox Code Playgroud)

一旦服务层是异步的,您就可以将控制器更改为异步.