首页 > 解决方案 > 循环内的 async/await 是否会造成瓶颈?

问题描述

假设我有以下代码,例如:

private async Task ManageClients()
{
    for (int i =0; i < listClients.Count; i++)
    {
        if (list[i] == 0)
            await DoSomethingWithClientAsync();
        else
            await DoOtherThingAsync();
    }

    DoOtherWork();
}

我的问题是:

1. for()会继续处理列表中的其他客户端吗?还是会等待直到完成其中一项任务。

2.在循环中使用async/await甚至是一种好习惯吗?

3.能不能做得更好?

我知道这是一个非常简单的示例,但我试图想象如果该代码是具有数千个客户端的服务器会发生什么。

标签: c#multithreadingloopsasync-await

解决方案


在您的代码示例中,当循环到达时代码将“阻塞” await,这意味着在第一个客户端完成之前不会处理其他客户端。这是因为,虽然代码使用异步调用,但它是使用同步逻辑思维方式编写的。

异步方法应该看起来更像这样:

private async Task ManageClients()
{
    var tasks = listClients.Select( client => DoSomethingWithClient() );
    await Task.WhenAll(tasks);
    DoOtherWork();
}

请注意,只有一个await,它同时等待所有客户端,并允许它们以任何顺序完成。这避免了循环阻塞等待第一个客户端的情况。


推荐阅读