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

时间:2016-11-29 00:32:31

标签: c# .net asynchronous async-await

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

2个控制器之间的重要区别在于这一行代码与WebClient:

同步

var content = client.DownloadString(url);

异步

var content = await client.DownloadStringTaskAsync(url);

非常基本的东西......

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

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

我很难过。

2 个答案:

答案 0 :(得分:3)

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)

尝试更改该值:)

答案 1 :(得分:1)

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