我有这两行代码:
var tasks = orders.Select(order => Task.Run(() => svc.Register(order)));
Task.WaitAll(tasks.ToArray());
然后Register方法的相关部分如下所示:
var httpResponse = await httpClient.PostAsync("/api/external/client", content);
if (httpResponse.IsSuccessStatusCode)
{
var response = await httpResponse.Content.ReadAsStringAsync();
var orderAccepted = string.IsNullOrEmpty(response);
}
这是在控制台应用程序中,所以我的想法是,这将同时处理所有帖子,然后,为了避免控制台应用程序在帖子完成之前结束,我认为我需要WaitAll。
不能100%地确定这是否可以按照我的想法工作,即使可以,我也想知道用Select()方法来设置所有Tasks是否像我所做的那样很酷,或者这看起来很奇怪的方法。
编辑:
此外,经过一番思考,我想知道这是否是更好的方法:
Parallel.ForEach(orders, async order => { await svc.Register(order); });
答案 0 :(得分:2)
如果您已经在调用异步方法,为什么要使用Task.Run
?
使用LINQ构建任务列表是完全有效的。实际上,如果您使用Task.WhenAll
,则可以执行以下操作:
Task.WhenAll(orders.Select(order => svc.Register(order))).Wait();
或者,如果您使用的是C#7.1或更高版本,则可以利用async Main:
await Task.WhenAll(orders.Select(order => svc.Register(order)));
Parallel.ForEach
更适用于CPU密集型工作负载,而不适合此类I / O密集型工作负载。
无论如何,您将受到service point manager的默认连接限制的限制。