Гаразд, це звучить дивно, але код дуже простий і добре пояснює ситуацію.
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
перший дзвінок, який мені належить, тому що він асинхронний. Далі я виконую ту роботу, яку мені потрібно робити, яка не пов'язана з IO чи ресурсами, і тому не є асинхронізованою. Нарешті, я зберігаю свою роботу, яка також є async
дзвінком, і поза вантажним культом я await
її.
Але це найбільш ефективний / правильний спосіб поводження з цією схемою? Мені здається, я міг пропустити await
останній дзвінок, але що робити, якщо він не працює? І чи варто використовувати такий Task
метод, як ContinueWith
ланцюг моєї синхронної роботи з оригінальним викликом? Я просто зараз, коли я не впевнений, чи правильно впораюся з цим.
Враховуючи код у прикладі , чи є кращий спосіб обробляти цей ланцюжок викликів методу async / sync / async?