优先线程。
Prioritize threads.
所以我的应用程序有 collection 点。每个点都有一个 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(session, value) 方法,而不是计时器 threads/methods。因此,当用户拨打电话时,无论我的 collection.
的大小如何,它都会立即响应,不会延迟。
看来你需要在这里排队。一个高优先级队列和一个低优先级队列。您所有的计时器线程都应该 post 到低优先级队列。用户消息应该进入高优先级队列。为了处理这些队列,你可以有一个线程池读取队列并处理数据,首先处理高优先级队列。这种方法可能适用于您的问题。
所以我的应用程序有 collection 点。每个点都有一个 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(session, value) 方法,而不是计时器 threads/methods。因此,当用户拨打电话时,无论我的 collection.
的大小如何,它都会立即响应,不会延迟。看来你需要在这里排队。一个高优先级队列和一个低优先级队列。您所有的计时器线程都应该 post 到低优先级队列。用户消息应该进入高优先级队列。为了处理这些队列,你可以有一个线程池读取队列并处理数据,首先处理高优先级队列。这种方法可能适用于您的问题。