gpt4 book ai didi

c# - await 在这个函数中做了什么?

转载 作者:行者123 更新时间:2023-11-30 18:50:23 25 4
gpt4 key购买 nike

我以为我理解 C# 中的 async-await 模式,但今天我发现我真的不理解。

在这样一个简单的代码片段中。我已经定义了 System.Net.ServicePointManager.DefaultConnectionLimit = 1000;

public static async Task Test()
{
HttpClient client = new HttpClient();
string str;
for (int i = 1000; i <= 1100; i++)
str = await client.GetStringAsync($"https://en.wikipedia.org/wiki/{i1}");
}

await 在这里做什么?最初我认为因为这是异步等待模式,这意味着基本上 HttpClient 将以多线程方式启动所有 HTTP GET 调用,即基本上应该一次获取所有 Urls。

但是当我使用 Fiddler 分析行为时,我发现它确实按顺序获取 URL。

我需要将其更改为这样才能使其正常工作:

public static async Task<int> Test()
{
int ret = 0;
HttpClient client = new HttpClient();
List<Task> taskList = new List<Task>();
for (int i = 1000; i <= 1100; i++)
{
var i1 = i;
var task = Task.Run(() => client.GetStringAsync($"https://en.wikipedia.org/wiki/{i1}"));
taskList.Add(task);
}
Task.WaitAll(taskList.ToArray());
return ret;
}

这次 URL 是并行获取的。那么 await 关键字在第一个代码片段中到底做了什么?

最佳答案

等待 HTTP 请求的完成。只有在每个请求完成后,代码才会恢复(for 迭代...)。

您的第二个版本之所以有效,是因为它不等待每个任务完成后才开始执行后续任务,而仅在所有任务都已启动后才等待所有任务完成。

async-await 的作用是允许调用 函数在异步函数等待时继续做其他事情,而不是同步(“正常”)函数阻塞调用函数直到完成。

关于c# - await 在这个函数中做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com