У мене є кілька служб async REST, які не залежать один від одного. Тобто під час "очікування" відповіді від Service1 я можу зателефонувати до Service2, Service3 тощо.
Наприклад, зверніться до коду нижче:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
Тепер service2Response
це не залежить від їх, service1Response
і їх можна отримати самостійно. Отже, немає потреби чекати відповіді першої служби, щоб зателефонувати на другу службу.
Я не думаю, що я можу Parallel.ForEach
тут використовувати, оскільки це не пов'язана з процесором операція.
Для того, щоб викликати ці дві операції паралельно, чи можу я зателефонувати на використання Task.WhenAll
? Одне питання, яке я бачу, використовуючи Task.WhenAll
те, що воно не дає результатів. Щоб отримати результат, я можу зателефонувати task.Result
після дзвінка Task.WhenAll
, оскільки всі завдання вже виконані, і все, що мені потрібно для отримання відповіді?
Приклад коду:
var task1 = HttpService1Async();
var task2 = HttpService2Async();
await Task.WhenAll(task1, task2)
var result1 = task1.Result;
var result2 = task2.Result;
// Use result1 and result2
Чи кращий цей код, ніж перший за рівнем продуктивності? Будь-який інший підхід я можу використовувати?
Parallel.ForEach
породжуватимуться нові нитки, тоді як вони async await
будуть робити все на одній темі.
await
) перед її готовністю.
WhenAll
перш ніж зайнятися Result
ідеєю, що вона виконує всі завдання раніше. Оскільки Task.Result блокує викликову нитку, я припускаю, що якщо я викличу її після того, як завдання фактично виконані, він негайно поверне результат. Я хочу підтвердити розуміння.
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
- Я не бачу логіки там. Паралельність - це паралельність.