我很少有彼此不依赖的异步REST服务。那就是在“等待” Service1的响应时,我可以调用Service2,Service3等。
例如,参考下面的代码:
var service1Response = await HttpService1Async();
var service2Response = await HttpService2Async();
// Use service1Response and service2Response
现在,它们service2Response
不再依赖service1Response
并且可以独立获取。因此,不需要我等待第一服务的响应来呼叫第二服务。
我不认为我可以Parallel.ForEach
在这里使用,因为它不是CPU限制的操作。
为了并行调用这两个操作,可以调用use 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 之前Result
完成所有任务。由于Task.Result阻止了调用线程,因此我假设如果在任务实际完成后调用它,它将立即返回结果。我想验证理解。
I do not think I can use Parallel.ForEach here since it is not CPU bound operation
-我看不到那里的逻辑。并发就是并发。