为什么异步代码处理更少的负载?

问题描述:

我创建了一个带有两个控制器的.Net Web Api,这两个控制器执行相同的操作(有目的地非常慢的网络调用)。一个是同步的,一个是异步的。您可以在这里找到代码: https://github.com/jkruer01/SyncVsAsync为什么异步代码处理更少的负载?

2个控制器之间的重要区别是代码与Web客户端这一行:

同步

var content = client.DownloadString(url); 

异步

var content = await client.DownloadStringTaskAsync(url); 

漂亮的基本东西...

然后我创建了一个控制台应用程序,向同步或异步控制器发出50个同时请求。我期望异步控制器完成更多的同时请求,但我发现确实相反。同步控制器成功完成了大约25个中的25个。异步控制器只能成功完成50个中的10个。

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

我很难过。

+0

可以限制在“服务器”上,它在处理多个请求时遇到问题,导致放缓? – JanR

+5

请在这里发布你的代码的相关部分。你要求人们搜索你的代码是不公平的。将问题缩小到特定区域,然后粘贴到此处。 – CodingYoshi

+0

我很困惑。在题目中,你谈论的是关于速度的问题,而在正文中则提到成功/失败的差异。你可以粘贴代码的相关部分以及一些评论和结果吗? – agfc

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

+0

不错,很高兴它工作:) ...这将是一个好主意,更新github回购新的变化太 –

+0

谢谢你提醒我。我只是推动了这些变化。我也做了一篇关于它的博客文章。 http://jeremykruer.com/why-my-synchronous-api-scaled-better-than-my-asynchronous-api/ – jkruer01

+0

不错!感谢您的参考:) ...我也很高兴它的工作,另一种方式来测试这可以通过使用这个:https://github.com/dotnet/BenchmarkDotNet给它一看,写得很好 –

问题是与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)

尝试更改该值:)

+0

我会试一试,让你知道我发现了什么。谢谢! – jkruer01

+0

我将此行添加到我的启动类中,但仍未解决问题。 System.Net.ServicePointManager.DefaultConnectionLimit = 1000; – jkruer01

+0

它使同步代码运行速度更快并允许更多请求,但异步代码仍然能够成功完成更少的请求。 – jkruer01