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

Posted

技术标签:

【中文标题】当处理程序调用 http 端点时,System.Threading.Timer 不会触发【英文标题】:System.Threading.Timer does not fire when handler calls a http endpoint 【发布时间】:2020-09-20 09:24:11 【问题描述】:

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

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

我将无法在此处发布代码,因为它是旧版专有代码

【问题讨论】:

是 10 个定时器还是 2 个?你能显示你的代码吗? minimal reproducible example 将不胜感激。 这是一个 ASP.NET 项目吗?控制台应用程序?赢表格?服务? 你应该确保你没有受到ThreadPool的限制,如果需要的话允许它快速扩展:ThreadPool.SetMinThreads(100, 10); 【参考方案1】:

我在 .net 框架中找到了这种行为的原因,您可以打开到端点的连接数有一个默认值。对于非 Web 应用程序,ServicePointManager.DefaultConnectionLimit 将此限制设置为 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 属性为 true 时以编程方式更改该值。在 AppDomain 加载时设置一次您的首选值。

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

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

【讨论】:

以上是关于当处理程序调用 http 端点时,System.Threading.Timer 不会触发的主要内容,如果未能解决你的问题,请参考以下文章

当需要 ssl 为真时无法调用 EWS

Google端点在日志中为GET /提供了无效的HTTP模板/

当客户端关闭连接时,Cowboy/Ranch 杀死处理程序进程

使用AWS Android SDK发送JWT令牌

为啥从模拟器的android应用程序调用REST API端点时连接失败

未找到处理程序方法