ASP NET MVC 5 Задача Асинхронное Создание асинхронного метода

1

Поэтому я просто хочу сделать свой сервисный слой 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();
  • 2
    Единственная реальная причина сделать метод асинхронным, если вы действительно можете сделать IO асинхронно. Если вы не можете, вы можете просто оставить это как синхронный метод.
  • 0
    Возврат строки, когда у вас есть тип возврата метода Task<string> - это правильное поведение. Просто поместите async перед вашим GetProjectsAsync() .
Показать ещё 3 комментария
Теги:
asp.net-mvc
asynchronous

2 ответа

5
Лучший ответ

При преобразовании в 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;
}

После того, как уровень сервиса будет асинхронным, вы можете изменить свои контроллеры на асинхронные.

  • 0
    Я не могу реализовать метод AllAsync потому что он говорит «не может неявно преобразовать список в задачу»
  • 0
    Посмотрите еще раз на код. Это ToListAsync , а не ToList .
Показать ещё 5 комментариев
-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 
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню