C# HttpWebRequest时间随着simultan请求的每次请求而增加

C# HttpWebRequest时间随着simultan请求的每次请求而增加,c#,.net,http,httpwebrequest,C#,.net,Http,Httpwebrequest,我对HttpWebRequest有问题。我试图同时向同一服务器发送多个请求。 当我检查响应的时间安排时,我发现它们占用的时间并不相同,而是随着每个请求的增加而增加 到目前为止,我的代码是: public static void Main() { ServicePointManager.Expect100Continue = false; ServicePointManager.UseNagleAlgorithm = false; ServicePointManager.D

我对HttpWebRequest有问题。我试图同时向同一服务器发送多个请求。 当我检查响应的时间安排时,我发现它们占用的时间并不相同,而是随着每个请求的增加而增加

到目前为止,我的代码是:

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