所以我只想制作服务图层async
。
我有一个新服务ProjectManagement
,我希望它的GetProjects
方法是异步的。
public Task<string> GetProjectsAsync()
{
var json = JsonConvert.SerializeObject(_repository.All<Projects>());
return json;
}
我知道这种方法不起作用,显然是因为我返回一个字符串,而不是Task<string>
。那么如何使用Task.Run()
运行此方法并返回结果?
我看过这个documentation,我对如何使用它有点困惑?
我想在控制器中做的就是:
var jsonData = await _projectManagement.GetProjectsAsync();
答案 0 :(得分:5)
转换为async
时,您希望从&#34;离开&#34;并努力实现您的控制器/ 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;
}
一旦服务层是异步的,您就可以将控制器更改为异步。
答案 1 :(得分:-3)
您应该尝试此链接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
}