【问题标题】:Prioritize threads.优先处理线程。
【发布时间】:2016-02-03 01:44:16
【问题描述】:

所以我的应用程序有一个积分集合。每个点都有一个 CheckStatusTimer、CheckNewDataTimer 和 CheckDevceTimer(它们是 System.Timers)。 A 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) 方法,而不是计时器线程/方法。因此,当用户拨打电话时,无论我的收藏有多大,它都会立即响应,不会有任何延迟。

【问题讨论】:

  • 不优先线程,优先工作。
  • 不太清楚你在问什么。假设您有 100 个点,每个点的采样时间为 30 秒,那么您将有 200 个计时器,每 30 秒触发 100 x (4 + 2 + 1) = 700 个事件。您要优先考虑哪些事件?请记住,优先级意味着通过减慢另一项任务来加快一项任务。

标签: c# multithreading threadpool


【解决方案1】:

看来您需要在这里排队。一个高优先级队列和一个低优先级队列。您所有的计时器线程都应该发布到低优先级队列。用户消息应该进入高优先级队列。为了处理这些队列,您可以拥有一个线程池来读取队列并处理数据,首先处理高优先级队列。这种方法可能适用于您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多