我會建議爲每個讀者創建一個讀者列表,併爲每個讀者創建一個Timer。喜歡的東西:
class Reader
{
// other stuff
Timer _updateTimer;
public void Connect(ipAddress, TimeSpan pollingFrequency)
{
// Do the connection
// Then set up the timer
_updateTimer = new Timer(UpdateProc, null,
pollingFrequency, pollingFrequency);
}
private void UpdateProc(object state)
{
// poll the device here, and do any update
}
}
以及創建讀者:
List<Reader> _readersList = new List<Reader>();
for all devices
var reader = new Reader();
reader.Connect(ipAddress, TimeSpan.FromSeconds(1));
_readersList.Add(reader);
現在,每一位讀者都會被輪詢每一秒。
如果輪詢/更新過程可能需要超過一秒鐘,您需要修改定時器更新過程,以便它不允許併發輸入。也就是說,如果一次輪詢操作花費的時間超過一秒鐘,計時器將再次啓動,然後您將遇到兩個線程嘗試輪詢相同設備的問題。可能最簡單的方法是用Monitor
:
private object _updateLock = new object();
private void UpdateProc(object state)
{
if (!Monitor.TryEnter(_updateLock)) return;
try
{
// poll and update
}
finally
{
Monitor.Exit(_updateLock);
}
}
您可以有一個讀者列表。如果你需要添加一個新的,你可以很容易地添加到列表中。 – Pheonyx 2014-10-20 15:43:31
第三方庫線程安全並且它是否實現併發訪問?多少個IP地址?每個線程一個IP地址不會很好地擴展,線程池可能會更好。 – Polyfun 2014-10-20 15:53:50
第三方dll確實支持併發訪問,因爲我創建了2個「讀取器」很好。我沒有和第三方dll的開發者談過,他們的文檔有點欠缺,支持起來很慢。我測試它會更快,而不是問問他們。 – 2014-10-21 07:41:26