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();
转换为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
}