Заменить методы классов Классы HiveService и HivesController, которые написаны в синхронном стиле, на асинхронные версии с применением модификатора async и оператора await.
-
"step5".
-
Исправить IHiveService, чтобы методы соответствовали TAP.
- Обернуть возвращаемые типы методов в Task<>. В случае, если метод возвращает void, заменить void на Task.
- Добавить Task в комментарий или добавить комментарий , если его не было.
- Добавить Async после имени метода.
Было:
/// <summary>
/// Gets something.
/// </summary>
/// <returns>A <see cref="Something"/>.</returns>
Something GetSomething();
/// <summary>
/// Does something.
/// </summary>
void DoSomething();
Стало:
/// <summary>
/// Gets something.
/// </summary>
/// <returns>A <see cref="Task{Something}"/>.</returns>
Task<Something> GetSomethingAsync();
/// <summary>
/// Does something.
/// </summary>
/// <returns>A <see cref="Task"/>.</returns>
Task DoSomethingAsync();
- Изменить методы сервиса HiveService, чтобы они стали асинхронными.
- Исправить сигнатуры методов, чтобы они соответствовали сигнатурам методов в интерфейсе IHiveService.
- Применить к сигнатурам методов модификатор async.
- Заменить синхронный вызов метода ToArray на асинхронный ToArrayAsync.
- Заменить синхронный вызов метода SaveChanges на асинхронный SaveChangesAsync.
- Добавить к вызовам ToArrayAsync и SaveChangesAsync оператор await.
Пример:
public async Task<Something> GetSomethingAsync()
{
var list = await _context.EntitySet.ToArrayAsync();
return list.FirstOrDefault();
}
- Исправить HivesController.
- Исправить сигнатуры синхронных методов - применить async и обернуть IHttpActionResult в Task.
- Добавить к вызовам асинхронных методов сервиса оператор await.
- Удалить из интерфейса IAsyncEntityStorage метод SaveChanges.
- Удалить из класса DomainContextBase метод SaveChanges.
- Собрать проект, исправить ошибки и предупреждения (если есть).
- Сохранить изменения как отдельный коммит с понятным описанием "Replace sync. method calls in HivesController and HiveService with async.".
- "step5" -> "master".
- GET /api/hives возвращает результат.
- GET /api/hives/1 возвращает результат.
- Поставить точку останова в HivesController.GetHives на строке с вызовом _hiveService.GetHives();
- GET /api/hives.
- Debug\Windows\Threads (Alt D W H).
- Записать ID и Managed ID текущего потока.
- F10.
- Debug\Windows\Threads.
- Сравнить ID и Managed ID текущего потока с записанными значениями.
Материалы для самостоятельного изучения:
- Task-based Asynchronous Pattern
- Анатомия веб-сервиса
- Effectively use async/await with ASP.NET Web API
Дополнительные материалы: