为什么异步WebRequests的实现比同步实现慢?

Joh*_*lly 0 c# performance asynchronous httpwebrequest async-await

我有一个应用程序,需要许多请求第三方REST服务.我认为修改应用程序的这一部分以异步方式发出请求可能会加快速度,所以我编写了一个POC控制台应用程序来测试.

令我惊讶的是,异步代码的完成时间几乎是同步版本的两倍.我只是做错了吗?

async static void LoadUrlsAsync() 
{
    var startTime = DateTime.Now;
    Console.WriteLine("LoadUrlsAsync Start - {0}", startTime);


    var numberOfRequest = 3;
    var tasks = new List<Task<string>>();

    for (int i = 0; i < numberOfRequest; i++)
    {
        var request = WebRequest.Create(@"http://www.google.com/images/srpr/logo11w.png") as HttpWebRequest;
        request.Method = "GET";

        var task = LoadUrlAsync(request);
        tasks.Add(task);
    }

    var results = await Task.WhenAll(tasks);

    var stopTime = DateTime.Now;
    var duration = (stopTime - startTime);
    Console.WriteLine("LoadUrlsAsync Complete - {0}", stopTime);
    Console.WriteLine("LoadUrlsAsync Duration - {0}ms", duration);
}

async static Task<string> LoadUrlAsync(WebRequest request)
{
    string value = string.Empty;
    using (var response = await request.GetResponseAsync())
    using (var responseStream = response.GetResponseStream())
    using (var reader = new StreamReader(responseStream))
    {
        value = reader.ReadToEnd();
        Console.WriteLine("{0} - Bytes: {1}", request.RequestUri, value.Length);
    }

    return value;
}
Run Code Online (Sandbox Code Playgroud)

注意:我还尝试在app.config中设置maxconnections = 100,以尝试消除来自system.net连接池的限制.此设置似乎不会对性能产生影响.

  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="100" />
    </connectionManagement>
  </system.net>
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

首先,尽量避免微基准测试.当您的代码时序差异被网络条件淹没时,您的结果将失去意义.

那就是说,你应该设置ServicePointManager.DefaultConnectionLimitint.MaxValue.此外,使用端到端async方法(即StreamReader.ReadToEndAsync) - 甚至更好,使用HttpClient,这是为asyncHTTP 设计的.