Поэтому я просто хочу сделать свой сервисный слой 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
вы хотите начать с "листа" и работать с вашими контроллерами/пользовательским интерфейсом. Я сделал много конверсий, и это лучший подход, который я нашел.
Итак, сначала определите любые операции, которые естественно асинхронны; любая привязка 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;
}
После того, как уровень сервиса будет асинхронным, вы можете изменить свои контроллеры на асинхронные.
AllAsync
потому что он говорит «не может неявно преобразовать список в задачу»
ToListAsync
, а не ToList
.
вы должны попробовать эту ссылку 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
}
Task<string>
- это правильное поведение. Просто поместите async перед вашимGetProjectsAsync()
.