【发布时间】:2014-02-20 19:29:25
【问题描述】:
我的应用程序必须每 30 秒 ping 一次(局域网)服务器才能让它知道我还活着。
这很好用,除了当我无法控制的单独进程使用大量系统资源并在它执行其操作时挂起整个机器。结果,我的计时器滴答声被延迟,直到其他进程完成繁重的工作,此时服务器已经认为我已经死了。
其他进程设置为低优先级,我的进程设置为普通优先级。
我的第一次尝试使用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 秒后结束?
【问题讨论】:
-
其他进程占用 CPU 多长时间?
-
@LasseV.Karlsen 它因正在执行的任务(3D 渲染)而异。介于 2 秒到 10 分钟之间。
-
无论如何,Windows 不是一个实时操作系统,它无法保证您的计时器/线程/代码将获得优先级的速度。在我看来,你最好的选择是让其他过程发挥得很好。你能降低它的优先级吗?
-
这听起来很奇怪。你确定你没有做一些事情,比如在等待它完成的情况下生成进程,因此你的计时器永远不会启动吗?另外,您确定您的
System.Timers.Timer事件处理程序没有抛出异常吗?如果事件处理程序抛出一个异常,Timer 将把它压扁,你的程序的其余部分将永远不会知道它。 -
分页 IO 不受 CPU 优先级影响。任何涉及 CPU 优先级的想法都无济于事。
标签: c# multithreading performance process timer