gpt4 book ai didi

c# - 为什么我的 .net 应用程序不会发出 10 个以上的并发 WebClient 请求?

转载 作者:太空狗 更新时间:2023-10-29 20:24:48 25 4
gpt4 key购买 nike

我正在尝试了解 C# 中的异步/等待和 Windows 中的 I/O 完成端口的复杂性,并编写代码来验证我的假设。

据我了解,调用 WebClient.DownloadStringTaskAsync(...)会让当前线程注册一个带有I/O完成端口的I/O操作(这个可能有点模糊,我还不明白细节),它会创建一个Task<string>它将继续执行代码。在某些时候它会遇到 await对于给定的任务。那时,它将从当前方法返回(好吧,它将从某个范围退出,我不确定这个范围是否可以是方法以外的东西 - 我可能应该检查生成的状态机以了解那部分) .一旦 I/O 操作完成,就会从线程池中抓取一个线程,将 I/O 操作的结果传递给它,并执行刚才提到的范围的其余部分。

我已经尝试验证这种行为,但在某些事情似乎不对之前只得到了这段 C# 代码:

class Program
{
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(30, 30);
Console.WriteLine("Connection limit is {0}", ServicePointManager.DefaultConnectionLimit);
for (int i = 0; i < 30; i++)
{
FetchAsync(i);
}

Console.WriteLine("Done starting requests");
Console.ReadKey();
}

private async static void FetchAsync(int num)
{
WebClient wc = new WebClient();
string result = await wc.DownloadStringTaskAsync("http://localhost/slow/index/15");
Console.WriteLine("Done #{0}", num);
}
}

如您所见,我使用的是 WebClient为一个网页创建 30 个请求(我知道这很慢,需要 15 秒才能响应)。运行此代码,我观察到以下行为: 15 秒后,前 10 个请求完成。再过 15 秒后,另外 10 个请求完成,再过 15 秒后,其余请求完成。因此,似乎一次只有 10 个未完成的请求(使用 perfmon 我已经验证被调用的 Web 应用程序有 10 个当前请求)。这是为什么?我期望有 30 个并发请求,因为我已经按照上面的代码设置了线程池的最大线程数。

This SO question让我相信ServicePointManager可能与它有关,但由于 DefaultConnectionLimit只有 2 我想没有连接。

我意识到这是对一个相当简单的问题的冗长描述。我希望它能让别人更容易准确地指出我的假设错误的地方。

我在 Windows 7 64 位机器上运行它。

最佳答案

您的客户端能够发送任意多个并发请求。不过,您的服务器是 localhost。客户端 Windows 操作系统对 Web 应用程序中的并发请求数有限制(因此您必须购买服务器许可证)。此限制为 10。您对此无能为力。

顺便说一句,您的应用正在使用异步 IO,因此在 IO 运行时您不需要任何线程(甚至不需要隐式线程池线程)。这不是你的问题。

关于c# - 为什么我的 .net 应用程序不会发出 10 个以上的并发 WebClient 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13103597/

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