簡體   English   中英

如何在C#的運行時實例化類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM