我的应用程序必须每30秒ping一次(lan)服务器,以便让它知道我还活着。
这样可以正常工作,除非我不控制的单独进程使用大量系统资源并在整个计算机执行时挂起整个计算机。结果,我的计时器刻度被延迟,直到另一个进程完成其繁重的工作,此时服务器已经认为我已经死了。
另一个进程设置为低优先级,我的进程设置为普通优先级。
我的第一次尝试使用System.Timers.Timer
启动ping。
在第二次尝试中,我尝试滚动自己的PriorityTimer
,在专用的高优先级线程上运行,但这似乎也没什么效果。
public sealed class PriorityTimer : IDisposable
{
private int interval;
private bool active;
private Thread timerThread;
private AutoResetEvent resetEvent;
public event EventHandler Elapsed;
public PriorityTimer(int interval)
{
this.interval = interval;
resetEvent = new AutoResetEvent(false);
}
public bool Enabled
{
get { return active; }
set
{
if (active != value)
{
active = value;
if (value)
{
timerThread = new Thread(Wait);
timerThread.IsBackground = true;
timerThread.Priority = ThreadPriority.Highest;
timerThread.Start();
}
else
{
resetEvent.Set();
}
}
}
}
private void Wait()
{
resetEvent.Reset();
while (!resetEvent.WaitOne(interval))
{
if (Elapsed != null)
{
Elapsed(this, EventArgs.Empty);
}
}
}
public void Dispose()
{
Enabled = false;
}
}
假设我无法强迫违规过程发挥出色,我该怎样做才能确保我的计时器在30秒内过去?
答案 0 :(得分:1)
当大量内存被分页到磁盘时,似乎会发生这种情况。
您可以尝试将自己的工作集保留在内存中,也可以强制其他(流氓)进程消耗更少。后一种策略更可靠。
创建Windows Job Object并配置其最大内存使用量。将有问题的流程分配到作业中。作业能够限制CPU使用和内存。它们意味着“监禁”过程。
答案 1 :(得分:0)
任何不强制实时约束的操作系统通常都会在争用时通过某些正常的delta错过计时器请求。你一直在追踪你的三角洲吗?
另外,我会问你是否使用垃圾收集语言。如果你是,暂停肯定会扭曲计时器结果。
最后,你用来发送心跳的计时器间隔是多少?作为一般经验法则,您应该每隔一段时间发送两次心跳以计算时间差异。