Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HttpClient';s SendAsync速度非常慢(不是代理问题)_C#_.net_Dotnet Httpclient - Fatal编程技术网

C# HttpClient';s SendAsync速度非常慢(不是代理问题)

C# HttpClient';s SendAsync速度非常慢(不是代理问题),c#,.net,dotnet-httpclient,C#,.net,Dotnet Httpclient,目前,使用HttpClient发送POST消息需要约600ms的时间。这似乎比它应该的要长得多,因为发送一篇与我为了测试而编写的C程序相同的帖子(使用一个简单的套接字)执行得要好得多,对于相同的操作大约37毫秒,代码也要多得多 sw.Start(); HttpResponseMessage result = client.SendAsync(request).Result; sw.Stop(); 这是我的测量方法。我知道我可以使用异步函数,并使用wait而不是使用任务结果,但是在这种情况下,不

目前,使用HttpClient发送POST消息需要约600ms的时间。这似乎比它应该的要长得多,因为发送一篇与我为了测试而编写的C程序相同的帖子(使用一个简单的套接字)执行得要好得多,对于相同的操作大约37毫秒,代码也要多得多

sw.Start();
HttpResponseMessage result = client.SendAsync(request).Result;
sw.Stop();
这是我的测量方法。我知道我可以使用异步函数,并使用wait而不是使用任务结果,但是在这种情况下,不必担心“阻塞”,使用wait/async也不会更快,因为异步发送和接收消息需要相同的时间。至少,这是我的理解

以下是其在函数中使用的示例:

    public void makeAttempt(string attempt)
    {
        Stopwatch sw = new Stopwatch();

        using (var request = new HttpRequestMessage() { Method = HttpMethod.Post })
        {
            request.RequestUri = new Uri("https://example.com/page?1");

            request.Content = new StringContent("attempt-" + trys.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded");
            sw.Start();
            HttpResponseMessage result = client.SendAsync(request).Result;
            sw.Stop();
        }

        Console.WriteLine("Request took: " + sw.ElapsedMilliseconds.ToString() + "ms");
        trys++;
    }
最初,我在同一语句中的using blocks中也包含了HttpClient和HttpClientHandler,但是我了解到HttpClient意味着要在多个请求上重用,所以我将它们移动到全局范围,并在构造函数中初始化它们,如下所示:

HttpClient client;
HttpClientHandler handler;

    public Test(CookieContainer jar, WebHeaderCollection heads)
    {
        cookieJar = jar;
        headers = heads;
        handler = new HttpClientHandler() { CookieContainer = cookieJar, AllowAutoRedirect = true, Proxy = null, UseProxy = false };
        client = new HttpClient(handler);
        client.BaseAddress = new Uri("https://example.com/");
        client.DefaultRequestHeaders.ExpectContinue = false;
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0");
    }

是否有人知道这可能是什么原因,或者如何改进此操作的性能?提前谢谢你,我会让大家了解我学到的任何东西!干杯

我已将.NET Core 2.1 SocketsHttpHandler向后移植到.NET Framework,并观察到在某些情况下,与.NET Framework HttpClientHandler相比,性能有了显著提高,特别是在同时发出数十个请求时。

您不应使用
。Result
,如果您想要同步的web方法,应该使用
System.Net.WebClient
而不是
HttpClient
。您应该切换类或使
maketrunt
async并使用async/await。为什么会有任何不同?正如我在最初的帖子中所说,在这种情况下,没有操作需要担心阻塞,从开始到结束的执行时间是相同的。根据要求,我做了建议的异步/等待更改,但不幸的是,这对性能没有明显的影响。