【问题标题】:Why does the Async Code Handle Less Load?为什么异步代码处理更少的负载?
【发布时间】:2016-12-06 03:28:46
【问题描述】:

我创建了一个带有两个控制器的 .Net Web Api,它们执行相同的操作(故意非常慢的网络调用)。一种是同步的,一种是异步的。你可以在这里找到代码: https://github.com/jkruer01/SyncVsAsync

这两个控制器之间的重要区别在于这行带有 WebClient 的单行代码:

同步

var content = client.DownloadString(url);

异步

var content = await client.DownloadStringTaskAsync(url);

相当基本的东西......

然后我创建了一个控制台应用程序,它可以同时向同步或异步控制器发出 50 个请求。我希望异步控制器能够同时完成更多的请求,但我发现事实恰恰相反。同步控制器成功完成了大约 50 次中的 25 次。异步控制器仅成功完成了大约 50 次中的 10 次。

这是为什么?我认为异步代码的目的是它可以处理更多的并发请求。

我被难住了。

【问题讨论】:

  • 可能限制在“服务器”上,它无法同时处理多个请求,导致速度变慢?
  • 请在此处发布您的代码的相关部分。你要求人们搜索你的代码是不公平的。将问题缩小到特定区域,然后将其粘贴到此处。
  • 我很困惑。在问题的标题中,您正在谈论速度,而在正文中,您正在谈论成功/失败的区别。您可以将代码的相关部分粘贴到一些 cmets 和结果中吗?
  • 我更新了我的问题以包含特定的代码差异。
  • 您没有添加正确数量的代码。具体来说,您在循环中使用 await 。这意味着您永远不会有两个同时请求 - “等待”意味着停止当前函数的执行,直到等待准备就绪。因此,循环的每次迭代都必须完成,然后函数才能恢复并进行另一次迭代。它是异步的,但仍以完全串行的方式发生。

标签: c# .net asynchronous async-await


【解决方案1】:

问题在于 http 请求,默认情况下您有两个并发调用的限制,这就是为什么它需要更长的时间,请参阅以下文档:

http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx https://msdn.microsoft.com/en-us/library/system.net.servicepoint.aspx

还有这个:Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

尝试更改该值:)

【讨论】:

  • 我会试一试,让你知道我发现了什么。谢谢!
  • 我将此行添加到我的启动类,但它仍然没有解决问题。 System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
  • 它使同步代码运行得更快并允许更多请求,但异步代码仍然成功完成较少的请求。
【解决方案2】:

我解决了这个问题。问题原来是我从 Visual Studio 运行代码的事实。即使我在“发布”模式下运行它,它也在做一些改变行为的事情(我不知道是什么)。我“发布”了代码,然后在 Visual Studio 之外运行它,它完全按照我的预期运行。感谢所有的帮助和建议!

【讨论】:

  • 很好,很高兴它起作用了 :) ... 用新的更改来更新 github 存储库也是个好主意
  • 感谢您的提醒。我只是推动了这些变化。我还写了一篇关于它的博客文章。 jeremykruer.com/…
  • 不错!!!感谢您的参考:) ...而且我很高兴它起作用了,另一种测试方法是使用这个:github.com/dotnet/BenchmarkDotNet 看看,顺便说一句写得很好
猜你喜欢
  • 2022-08-10
  • 1970-01-01
  • 2018-10-03
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多