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)
转换为时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)
一旦服务层是异步的,您就可以将控制器更改为异步.
| 归档时间: |
|
| 查看次数: |
3325 次 |
| 最近记录: |