所以我只想做我的服务层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
,但是您需要更深入地研究并使其完全异步。
例如,我假设您的存储库正在使用Entity Framework,并且您的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;
}
一旦服务层是异步的,则可以将控制器更改为异步。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句