每隔几秒钟,我就会使用System.Timers.Timer进行回调。回调基本上是向连接的服务器发送连续的心跳消息。
如果心跳消息在n秒钟内没有发送,则服务器将其与连接的客户端断开连接。
我所观察到的是,当用户机器的资源利用率很高时,比如- 100%的CPU利用率和几乎95%的内存利用率和系统对用户交互没有响应时,计时器回调就不会被调用。
我也尝试了System.Threading.Timer,但没有运气,得到了同样的结果。
在.NET中,确保无论机器资源利用率如何都调用操作的最佳方法是什么。
注:
发布于 2016-02-29 08:01:34
看起来你的周期性心跳对你的应用程序来说是非常关键的,可能比UI响应性和其他问题更重要。
在这种情况下,在实时系统中,通常会为具有高优先级的线程创建一个专用线程。
因此,尝试创建一个专用线程(不是BackgroundWorker,而是新的System.Threading.Thread),给予它高优先级(ThreadPriority.Highest),并从这个优先级线程发送心跳。
发布于 2016-02-29 09:15:01
答案是“.NET中确保操作调用的最佳方式是什么,而不管机器资源利用率如何”。取决于你对“不管”的定义。
这个问题属于实时计算领域。
如果您试图在windows上使用C#,恐怕您能达到的最接近的目标是将线程放在“实时”优先级上,然后在调用之间使用SpinWait。结果是,您的线程将占用单个核心的100%的利用率。
即使这样,你也可能会遇到时间问题。
您可能想看看如何在C++中使用实时操作系统和程序。
然而,这两种解决方案都非常昂贵。
但是,我建议您应该修复问题的真正核心,这就是您的应用程序显然没有高效地使用线程。您可能希望用异步I/O重写整个应用程序,这将降低CPU的利用率。
您还可以尝试将您的应用程序横向扩展。但是很明显,你的系统已经超过了这个盒子。
发布于 2016-03-02 09:05:11
我想要的最后一个方法是-
我必须承认,这仍然不能解决问题,但只是试图拖延失败。
https://stackoverflow.com/questions/35692766
复制相似问题