所以我的应用程序有一个Points集合。每个点都有一个CheckStatusTimer,CheckNewDataTimer和CheckDevceTimer(它们是System.Timers)。 Point有一个sampleTime属性。如果采样时间设置为30秒,则:
CheckStatusTimer.Interval = sampleTime/4; // ~7 seconds, it will reset and start over
CheckNewDataTimer.Interval = sampleTime/2; // 15 seconds, it will reset and start over
CheckDevceTimer.Interval = sampleTime; // 30 seconds, it will reset and start over
所有这些定时器都会触发一个从连接的(Modbus tcp)设备中提取数据的功能,这需要一些时间。可以想象,我添加的点越多,将调度的线程越多,用户调用的处理时间就越长。
我创建了一个处理用户传入消息的任务。
Task.Factory.StartNew(() => this.ProccessMessage(session, value));
我试图设置(我知道这是个坏主意)
Thread.CurrentThread.Priority = ThreadPriority.Highest;
但这没有用,也试图
var worker = new Thread(() = this.ProccessMessage(session, value))
{
Priority = ThreadPriority.Highest
};
worker.Start();
它不起作用,处理时间没有差异。 所以我的问题是如何在计时器线程/方法上优先考虑线程或this.ProccessMessage(会话,值)方法。因此,当用户拨打电话时,无论我的收藏大小如何,它都会立即做出响应而不会有任何延迟。
答案 0 :(得分:1)
看起来你需要队列。一个高优先级队列和一个低优先级队列。所有计时器线程都应该发布到低优先级队列。用户消息应该转到高优先级队列。要处理这些队列,您可以拥有一个读取队列并处理数据的线程池,首先处理高优先级队列。这种方法可能适用于您的问题。