C# HttpWebRequest时间随着simultan请求的每次请求而增加
我对HttpWebRequest有问题。我试图同时向同一服务器发送多个请求。 当我检查响应的时间安排时,我发现它们占用的时间并不相同,而是随着每个请求的增加而增加 到目前为止,我的代码是:C# HttpWebRequest时间随着simultan请求的每次请求而增加,c#,.net,http,httpwebrequest,C#,.net,Http,Httpwebrequest,我对HttpWebRequest有问题。我试图同时向同一服务器发送多个请求。 当我检查响应的时间安排时,我发现它们占用的时间并不相同,而是随着每个请求的增加而增加 到目前为止,我的代码是: public static void Main() { ServicePointManager.Expect100Continue = false; ServicePointManager.UseNagleAlgorithm = false; ServicePointManager.D
public static void Main()
{
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.DefaultConnectionLimit = 1000;
while(true)
{
List<Task> tasks = new List<Task>();
for (int currency = 1; currency <= 4; currency++)
{
tasks.Add(Task.Factory.StartNew(async () =>
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("theurl"));
request.Method = "GET";
request.Host = "thehost";
request.UserAgent = "Mozilla";
request.Accept = "*/*";
request.Headers.Add("Content-Encoding", "gzip");
request.AutomaticDecompression = DecompressionMethods.GZip;
request.KeepAlive = false;
request.Proxy = null;
long t1 = DateTime.Now.Ticks;
var response = await request.GetResponseAsync();
Stream receiveStream = response.GetResponseStream();
BufferedStream buffer = new BufferedStream(receiveStream);
StreamReader reader = new StreamReader(buffer, Encoding.UTF8);
var result = reader.ReadToEnd();
long t2 = DateTime.Now.Ticks;
var whatweneed = JSON.Parse(result).At("whatweneed");
Console.Write(whatweneed + " : ");
Console.WriteLine((t2 - t1) / 10000.0);
}));
}
Thread.Sleep(1000);
Task.WaitAll(tasks.ToArray());
Console.WriteLine();
}
Console.ReadKey();
}
这怎么可能???这种行为背后是什么概念
更新代码
public static void Main()
{
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.DefaultConnectionLimit = 1000;
while(true)
{
List<Task> tasks = new List<Task>();
for (int value = 1; value <= 4; value++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("theurl"));
request.Method = "GET";
request.Host = "thehost";
request.UserAgent = "Mozilla";
request.Accept = "*/*";
request.Headers.Add("Content-Encoding", "gzip");
request.AutomaticDecompression = DecompressionMethods.GZip;
request.KeepAlive = false;
request.Proxy = null;
using (Stream receiveStream = request.GetResponse().GetResponseStream())
{
long t1 = DateTime.Now.Ticks;
using(BufferedStream buffer = new BufferedStream(receiveStream))
{
using (StreamReader reader = new StreamReader(buffer, Encoding.UTF8))
{
var result = reader.ReadToEnd();
long t2 = DateTime.Now.Ticks;
var whatweneed = JSON.Parse(result).At("whatweneed");
Console.Write(listing + " : ");
Console.WriteLine((t2 - t1) / 10000.0);
}
}
}
}));
}
Thread.Sleep(250);
Task.WaitAll(tasks.ToArray());
Console.WriteLine();
}
Console.ReadKey();
}
看起来有点奇怪,计时提高了,然后第9次或第10次看起来又“正常”了?
但是在主实现中,我只会在同一时间发送4个请求,然后处理它们,大约2-3秒后我会再次执行。尝试使用
块将您的IDisposable
实现放入:流,WebResponse
,异步lambda过早地返回到线程池(在第一次等待时)。使用Task.Run。或者,只需使用同步代码。可能是因为这个原因,您插入了睡眠。早期下载任务可能会使您的网络连接流量饱和,因此,以后的任务需要更长的时间来下载响应。这应该是不可能的-响应是一个非常小的文件,不应该导致大量流量Fiddler看到请求发送和接收的速度有多快。时间安排和你期望的相符吗?使用4个以上的请求来查看更多数据。
public static void Main()
{
ServicePointManager.Expect100Continue = false;
ServicePointManager.UseNagleAlgorithm = false;
ServicePointManager.DefaultConnectionLimit = 1000;
while(true)
{
List<Task> tasks = new List<Task>();
for (int value = 1; value <= 4; value++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(string.Format("theurl"));
request.Method = "GET";
request.Host = "thehost";
request.UserAgent = "Mozilla";
request.Accept = "*/*";
request.Headers.Add("Content-Encoding", "gzip");
request.AutomaticDecompression = DecompressionMethods.GZip;
request.KeepAlive = false;
request.Proxy = null;
using (Stream receiveStream = request.GetResponse().GetResponseStream())
{
long t1 = DateTime.Now.Ticks;
using(BufferedStream buffer = new BufferedStream(receiveStream))
{
using (StreamReader reader = new StreamReader(buffer, Encoding.UTF8))
{
var result = reader.ReadToEnd();
long t2 = DateTime.Now.Ticks;
var whatweneed = JSON.Parse(result).At("whatweneed");
Console.Write(listing + " : ");
Console.WriteLine((t2 - t1) / 10000.0);
}
}
}
}));
}
Thread.Sleep(250);
Task.WaitAll(tasks.ToArray());
Console.WriteLine();
}
Console.ReadKey();
}
whatweneed : 100,5859
whatweneed : 103,5156
whatweneed : 106,4453
whatweneed : 109,375
whatweneed : 112,3047
whatweneed : 116,2109
whatweneed : 119,1406
whatweneed : 121,0938
whatweneed : 101,5625
whatweneed : 101,5625
whatweneed : 107,4219
whatweneed : 111,3281
whatweneed : 113,2813
whatweneed : 117,1875
whatweneed : 120,1172
whatweneed : 123,0469
whatweneed : 126,9531
whatweneed : 128,9063
whatweneed : 92,7735
whatweneed : 92,7734