При преобразовании в 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;
}
После того, как уровень службы является асинхронным, то вы можете изменить контроллеры асинхронной.
Единственная настоящая причина делает метод асинхронным, если вы действительно можете выполнить IO асинхронно. Если вы не можете, вы можете просто оставить его синхронным методом. – Servy
Возврат строки при возврате типа метода 'Task' является правильным поведением. Просто поместите async перед методом 'GetProjectsAsync()'. –
Abhijeet
@Abhijeet Это ужасная идея. Это создает синхронный метод и просто завершает его результат в задачу, по существу делая утверждение, что это асинхронная ложь. Вы не должны этого делать. Если вы не хотите, чтобы метод был асинхронным, вы не должны лгать своим абонентам и утверждать, что вы асинхронны. – Servy