2016-02-03 135 views
1

所以我的應用程序有一個點的集合。每個點都有一個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

不要優先考慮線程,優先考慮工作。 –

+0

這是不是很清楚你問什麼。假設你有100個點,每個點的採樣時間爲30秒,那麼你將有200個計時器,每30秒觸發100個(4 + 2 + 1)= 700個事件。你試圖優先考慮哪些事件?請記住,優先級意味着通過減慢另一項任務來加快完成一項任務。 – Enigmativity

回答

1

看起來你需要隊列在這裏。一個高優先級隊列和一個低優先級隊列。您的所有計時器線程都應發佈到低優先級隊列。用戶消息應該轉到高優先級隊列。爲了處理這些隊列,你可以有一個線程池讀隊列並處理數據,首先處理高優先級隊列。這種方法可能適用於您的問題。