这是await异步内容的正确用法吗?

时间:2018-10-10 22:45:11

标签: async-await

我有这两行代码:

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); });

1 个答案:

答案 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的默认连接限制的限制。