2014-10-20 83 views
0

我正在使用第三方DLL通過以太網連接到一個RFID閱讀器,現在我已經將這個工作通過一個單獨的RFID閱讀器使用以下工作:如何在運行時在C#中實例化一個類

private static readonly CRRU4 myReader = new CRRU4(); 

然後我通過它連接信息,其中包括IP地址和所需的不同參數。

現在我的問題是,我將如何做到這一點的IP地址數量?我需要參考每位讀者閱讀RFID標籤並分別處理。

我曾經想過通過每個RFID讀寫器進行循環,連接做一個讀取然後斷開連接,但這是不可行的。我想每秒提供更新,連接可能需要2-3秒才能完成。

多線程工作的東西會是這樣嗎?對於每個IP產生一個新的線程,並告訴它處理特定的IP?

+0

您可以有一個讀者列表。如果你需要添加一個新的,你可以很容易地添加到列表中。 – Pheonyx 2014-10-20 15:43:31

+1

第三方庫線程安全並且它是否實現併發訪問?多少個IP地址?每個線程一個IP地址不會很好地擴展,線程池可能會更好。 – Polyfun 2014-10-20 15:53:50

+0

第三方dll確實支持併發訪問,因爲我創建了2個「讀取器」很好。我沒有和第三方dll的開發者談過,他們的文檔有點欠缺,支持起來很慢。我測試它會更快,而不是問問他們。 – 2014-10-21 07:41:26

回答

1

我會建議爲每個讀者創建一個讀者列表,併爲每個讀者創建一個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); 
    } 
} 
相關問題