[英]How do I instantiate a class at runtime in C#
我正在使用通過以太網連接到RFID讀取器的第三方DLL,現在我可以使用以下方法對單個RFID讀取器正常工作:
private static readonly CRRU4 myReader = new CRRU4();
然后,我將連接信息傳遞給它,其中包括IP地址和所需的不同參數。
現在我的問題是,如何對多個IP地址執行此操作? 我需要參考每個閱讀器來讀取RFID標簽並分別處理。
我曾考慮過在每個RFID讀取器之間循環,先進行連接再進行讀取,然后斷開連接,但這在時間上是不可行的。 我想每秒提供更新,連接可能需要2-3秒才能完成。
多線程會為這樣的事情工作嗎? 為每個IP產生一個新線程並告訴它處理特定IP?
我建議創建一個閱讀器列表,並為每個閱讀器創建一個計時器 。 就像是:
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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.