Хорошо, это звучит странно, но код очень прост и хорошо объясняет ситуацию.
public virtual async Task RemoveFromRoleAsync(AzureTableUser user, string role)
{
AssertNotDisposed();
var roles = await GetRolesForUser(user);
roles.Roles = RemoveRoles(roles.Roles, role);
await Run(TableOperation.Replace(roles));
}
(Я знаю, что говорю вроде в абстрактном ниже, но выше это фактический метод из того, что будет на самом деле производственный код, который на самом деле делает то, о чем я здесь спрашиваю, и я на самом деле заинтересован в том, чтобы вы на самом деле рецензирование это для корректности по отношению к шаблону асинхронности / ожидания.)
Я сталкиваюсь с этим паттерном все чаще и чаще сейчас, когда использую async
/ await
больше. Шаблон состоит из следующей цепочки событий:
- Жду первоначального звонка, который дает мне некоторую информацию, с которой мне нужно поработать
- Работать с этой информацией синхронно
- Жду окончательного звонка, который сохраняет обновленную работу
Приведенный выше блок кода, как правило, относится к обработке этих методов. Я await
первый звонок, который я должен, потому что это асинхронный. Затем я выполняю работу, которая мне необходима, которая не связана с вводом-выводом или ресурсами, и поэтому не асинхронна. Наконец, я сохраняю свою работу, которая также является async
вызовом, и из-за груза культа я await
его.
Но является ли это наиболее эффективным / правильным способом обработки этого паттерна? Мне кажется, я мог бы пропустить await
последний звонок, но что, если он потерпит неудачу? И должен ли я использовать такой Task
метод, ContinueWith
чтобы связать мою синхронную работу с исходным вызовом? Я сейчас нахожусь в точке, где я не уверен, правильно ли я это делаю.
Учитывая код в примере , есть ли лучший способ обработать эту цепочку вызовов метода async / sync / async?