c# - 循环内的 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.能不能做得更好?
我知道这是一个非常简单的示例,但我试图想象如果该代码是具有数千个客户端的服务器会发生什么。
解决方案
在您的代码示例中,当循环到达时代码将“阻塞” await
,这意味着在第一个客户端完成之前不会处理其他客户端。这是因为,虽然代码使用异步调用,但它是使用同步逻辑思维方式编写的。
异步方法应该看起来更像这样:
private async Task ManageClients()
{
var tasks = listClients.Select( client => DoSomethingWithClient() );
await Task.WhenAll(tasks);
DoOtherWork();
}
请注意,只有一个await
,它同时等待所有客户端,并允许它们以任何顺序完成。这避免了循环阻塞等待第一个客户端的情况。
推荐阅读
- ios - Flutter Google Maps 插件在 iOS 上无法正常工作
- selenium-ide - 如何在 Chrome 上修复 Katalon Recorder
- apache2 - .htaccess 在默认 apache2 目录的子目录中
- python - 如何递归输出给定长度的0和1的排列?
- postgresql - 如何知道 Postgresql 服务器在什么操作系统/平台上运行?
- augmented-reality - AR.js:增加稳定性的多个标记?
- javascript - 设置默认单选输入和相应的复选框
- java - 我的缩进有问题吗?
- javascript - 如果对象具有属性,则对对象数组进行排序
- javascript - Javascript validation on hidden field is not working in MVC