asp.net MVC 5任务异步创建异步方法

本文关键字:异步 创建 异步方法 任务 net MVC asp | 更新日期: 2023-09-27 18:08:17

所以我只想把我的服务层命名为async

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

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

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

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

我想在控制器中做的就是:

var jsonData = await _projectManagement.GetProjectsAsync();

asp.net MVC 5任务异步创建异步方法

转换为async时,您要从"叶子"开始,并朝着控制器/UI工作。我做过很多转换,这是我发现的最好的方法。

因此,首先确定任何自然异步的操作;任何与I/o相关的东西都是不错的选择。您已经确定了一个:数据库调用。

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

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

public List<T> All<T>()
{
  return _context.Set<T>().ToList();
}

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

public Task<List<T>> AllAsync<T>()
{
  return _context.Set<T>().ToListAsync();
}

一旦您有了至少一个异步存储库方法,您就可以开始将服务层更改为异步,因此下面的代码:

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

变成这样:

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

一旦服务层是异步的,那么你就可以把你的控制器改成异步的

你应该试试这个链接http://www.dotnetperls.com/async

private async void DoAsyncWork()
{ 
   var data = await GetProjectAsync();
}
async Task<string> GetProjectAsynce()
{
    // code to get stuff done
    // await key word may be needed depending on
    // what you are doinf
    return JsonConvert.SerializeObject(myRepository.All<Projects>());
    // convert to string first of course 
}