C# 控制台应用程序比asp.net应用程序慢

C# 控制台应用程序比asp.net应用程序慢,c#,asp.net,performance,task-parallel-library,parallel.foreach,C#,Asp.net,Performance,Task Parallel Library,Parallel.foreach,我有一个crawlerbot,它使用parallel.for和parallel.foreach并行下载各种页面。MaxDegreeOfParallelism设置为20左右,因为增加它似乎不会进一步提高性能,我不想让任何web服务器过载 当我从ASP.NET网站(所有地方)开始爬网时,它以可接受的性能运行,并且需要几个小时。由于此设置的设计问题,我正在更改此设置,以便可以从控制台启动它 我需要的所有代码都在一个dll中,可以被网站和控制台应用程序访问 除了启动消息外,控制台没有任何输出 问题是,当

我有一个crawlerbot,它使用parallel.for和parallel.foreach并行下载各种页面。MaxDegreeOfParallelism设置为20左右,因为增加它似乎不会进一步提高性能,我不想让任何web服务器过载

当我从ASP.NET网站(所有地方)开始爬网时,它以可接受的性能运行,并且需要几个小时。由于此设置的设计问题,我正在更改此设置,以便可以从控制台启动它

我需要的所有代码都在一个dll中,可以被网站和控制台应用程序访问

除了启动消息外,控制台没有任何输出

问题是,当我从控制台(或调试器)运行它时,所需时间大约是从ASP.NET网站运行它时的10倍(!)。如果ASP.NET版本比控制台慢,我会发现更容易理解

为什么会这样,或者我如何调试它,或者找出原因,或者修复问题

编辑: 在通过visual studio调试器尝试这两种变体时,也会发生这种情况。 从“调试”到“输出”窗口的输出类似于:

线程“”(0x1d34)已退出,代码为0(0x0)。 线程“”(0xf20)已退出,代码为0(0x0)。 线程“”(0x3414)已退出,代码为0(0x0)。 线程“”(0x35c8)已退出,代码为0(0x0)。 线程“”(0xdc)已退出,代码为0(0x0)。 线程“”(0x1c98)已退出,代码为0(0x0)。 线程“”(0x3308)已退出,代码为0(0x0)。 线程“”(0x2b00)已退出,代码为0(0x0)。 线程“”(0x2f7c)已退出,代码为0(0x0)。 线程“”(0x345c)已退出,代码为0(0x0)。 线程“”(0x2a18)已退出,代码为0(0x0)。 线程“”(0x138)已退出,代码为0(0x0)。 线程“”(0x3650)已退出,代码为0(0x0)。 线程“”(0x376c)已退出,代码为0(0x0)

除了在ASP.NET的情况下,这个文本写得快了10倍


也许还值得一提的是,dll通过COM为每个下载的页面调用7zip来压缩它。

如果您从同一服务器下载大量页面,您将遇到由设置的限制。默认值通常为2(),但ASP.NET应用程序的默认值似乎为10。如果您看到的是不同的数字,则可能是某些内容更改了默认值

当您达到此限制时,框架将不再与特定服务器(或“端点”)建立任何连接,因此您的大多数线程将阻止执行任何操作


您可以通过更改
DefaultConnectionLimit
的值来解决此问题,但更好的解决方案可能是更改请求的顺序,这样您就不会对同一服务器同时执行许多请求。

在这两种情况下,您是否在同一硬件上运行代码?是,所有这些都在我的开发机器上运行。它从同一台服务器下载了很多页面吗?和在这两种环境中的价值是什么?你有没有试着弄清楚经济放缓的确切原因?这里的信息太少,除了猜测原因之外,没有别的办法@斯维克的建议很好。您需要进行一些分析,以确定减速的位置。@svick它试图同时从同一主机名下载大量页面,是的。控制台应用程序的DefaultConnectionLimit=2,ASP.NET应用程序的DefaultConnectionLimit=2147483647。(ASP.NET和控制台应用程序的设置之间还有其他主要区别吗?)在控制台应用程序开始时将DefaultConnectionLimit更改为80,使控制台应用程序几乎与ASP.NET应用程序一样快。如果你写评论作为回答,我会接受。