如何在C#中运行时实例化一个类

时间:2014-10-20 15:31:34

标签: c# multithreading rfid

我正在使用通过以太网连接到RFID阅读器的第三方DLL,现在我已经使用以下内容对单个RFID阅读器无问题了:

private static readonly CRRU4 myReader = new CRRU4();

然后我传递了连接信息,其中包括IP地址和所需的不同参数。

现在我的问题是,我如何为多个IP地址执行此操作?我需要引用每个读取器来读取RFID标签并单独处理它们。

我考虑过骑自行车穿过每个RFID阅读器,连接进行读取然后断开连接,但这根据时间不可行。我想每秒提供更新,连接可能需要2-3秒才能完成。

多线程会为这样的事情工作吗?对于每个IP产生一个新线程并告诉它处理一个特定的IP?

1 个答案:

答案 0 :(得分: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);
    }
}