我想使用多线程Web请求,但我没有得到我期望的性能。
我用4个内核运行,带有1 Gbps上传和1 Gbps下载。
对于测试,我正在下载Google主页。
Google页面的数据大小约为50 kb。
我正在同时发送1000个请求,除了在〜2秒内完成所有请求,但要完成20秒以上才能完成
我的代码看起来像这样:
bool success = ThreadPool.SetMinThreads(workerThreads: 2000, completionPortThreads: 1000);
success = ThreadPool.SetMaxThreads(2000, 2000);
DateTime dt = DateTime.UtcNow;
Parallel.For(0, 1000, (num) =>
{
string url = "https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl";
using (WebClient web = new WebClient())
{
byte[] bytes = web.DownloadData(url);
}
}
);
double sec = (DateTime.UtcNow - dt).TotalSeconds;
Console.WriteLine(sec);
我认为您的情况下的更好选择是使用HttpClient
具有显式异步操作,让Windows管理线程池本身。
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000; i++)
{
var httpClient = new HttpClient();
results[i] = httpClient.GetByteArrayAsync(@"https://www.google.co.il/?gfe_rd=cr&dcr=0&ei=OZy3WcmoMY7b8Affj4F4&gws_rd=ssl");
}
var status = Task.WhenAll(results); //WhenAny if you can process results independently
var pages = status.Result;
sw.Stop();
double sec = sw.Elapsed.TotalSeconds;
Console.WriteLine(sec);
旁注:请考虑使用Stopwatch
进行时间测量。
解决方案是:
System.Net.ServicePointManager.DefaultConnectionLimit = int.MaxValue;