2014-10-20 81 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); 
    } 
} 
相关问题