System.Threading.Timer 处理程序调用 http 端点时不会触发

System.Threading.Timer does not fire when handler calls a http endpoint

我有一个 window 服务,它使用 System.Threading.Timer 以特定配置的时间间隔调用端点。我已经说过 10 个实例计时器配置为以相同的时间间隔(比如 10 秒)调用相同的端点。如果 HTTP 端点需要更长的时间才能完成,则不会触发其他我的计时器事件。其他计时器在 http 调用 returns 之后触发。 在任何时间点,只有两个计时器同时被触发并运行处理程序代码。在执行处理程序代码期间,其他计时器的none 被触发。

准确地说,只有 2 个计时器同时 运行。我正在使用 .net 框架 4.8

我无法post这里的代码,因为它是遗留的专有代码

我在 .net Framework 中找到了此行为的原因,您可以打开到端点的连接数有一个默认值。 ServicePointManager.DefaultConnectionLimit 对于非 Web 应用程序,将此限制设置为 2。由于我的代码 运行 作为 windows 服务,它被限制为 2。您可以通过设置

来覆盖此行为
Uri atmos = new Uri("http://endpoint");
ServicePoint sp = ServicePointManager.FindServicePoint(atmos);
sp.ConnectionLimit = 64;

或者您可以在配置文件中指定设置 <system.net> <connectionManagement> <add address="**http://endpoint**" maxconnection="**64**"/> </connectionManagement> </system.net>

--来自msdn的专家-- ServicePoint 对象允许的最大并发连接数。 ASP.NET 托管应用程序的默认连接限制为 10,所有其他应用程序的默认连接限制为 2。当应用程序 运行 宁作为 ASP.NET 主机时,如果 autoConfig 属性 设置为 true,则无法通过配置文件更改此 属性 的值.但是,您可以在 autoConfig 属性 为真时以编程方式更改该值。在 AppDomain 加载时设置一次您的首选值。

https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.defaultconnectionlimit?view=netframework-4.8

感谢所有回答此问题的人。