首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当计算机资源利用率高时,.NET计时器不会回调

当计算机资源利用率高时,.NET计时器不会回调
EN

Stack Overflow用户
提问于 2016-02-29 05:48:21
回答 3查看 272关注 0票数 2

每隔几秒钟,我就会使用System.Timers.Timer进行回调。回调基本上是向连接的服务器发送连续的心跳消息。

如果心跳消息在n秒钟内没有发送,则服务器将其与连接的客户端断开连接。

我所观察到的是,当用户机器的资源利用率很高时,比如- 100%的CPU利用率和几乎95%的内存利用率和系统对用户交互没有响应时,计时器回调就不会被调用。

我也尝试了System.Threading.Timer,但没有运气,得到了同样的结果。

在.NET中,确保无论机器资源利用率如何都调用操作的最佳方法是什么。

注:

  • 这种实现在正常情况下非常完美。
  • 我不使用来自windows应用程序的UI线程来调用回调,而是使用后台(非UI)线程。
EN

回答 3

Stack Overflow用户

发布于 2016-02-29 08:01:34

看起来你的周期性心跳对你的应用程序来说是非常关键的,可能比UI响应性和其他问题更重要。

在这种情况下,在实时系统中,通常会为具有高优先级的线程创建一个专用线程。

因此,尝试创建一个专用线程(不是BackgroundWorker,而是新的System.Threading.Thread),给予它高优先级(ThreadPriority.Highest),并从这个优先级线程发送心跳。

票数 3
EN

Stack Overflow用户

发布于 2016-02-29 09:15:01

答案是“.NET中确保操作调用的最佳方式是什么,而不管机器资源利用率如何”。取决于你对“不管”的定义。

这个问题属于实时计算领域。

如果您试图在windows上使用C#,恐怕您能达到的最接近的目标是将线程放在“实时”优先级上,然后在调用之间使用SpinWait。结果是,您的线程将占用单个核心的100%的利用率。

即使这样,你也可能会遇到时间问题。

您可能想看看如何在C++中使用实时操作系统和程序。

然而,这两种解决方案都非常昂贵。

但是,我建议您应该修复问题的真正核心,这就是您的应用程序显然没有高效地使用线程。您可能希望用异步I/O重写整个应用程序,这将降低CPU的利用率。

您还可以尝试将您的应用程序横向扩展。但是很明显,你的系统已经超过了这个盒子。

票数 1
EN

Stack Overflow用户

发布于 2016-03-02 09:05:11

我想要的最后一个方法是-

  • 将ping频率(心跳)持续时间从现有的n秒提高到3*n秒。
  • 从高优先级线程发送ping消息。

我必须承认,这仍然不能解决问题,但只是试图拖延失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35692766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档