我正在使用一个第三方DLL,它通过以太网连接到RFID读取器,现在我已经使用以下内容在单个RFID读取器上正常工作:
private static readonly CRRU4 myReader = new CRRU4();然后,我向它传递连接信息,其中包括IP地址和所需的不同参数。
现在我的问题是,对于多个IP地址,我如何做到这一点?我需要参考每个读取器来读取RFID标签,并分别处理它们。
我已经考虑过循环通过每个RFID读取器,连接进行读取,然后断开连接,但这在时间上是不可行的。我想提供每秒更新,连接可能需要2-3秒才能完成。
对于这样的事情,多线程可以工作吗?为每个IP生成一个新线程,并告诉它处理特定的IP?
发布于 2014-10-20 23:56:35
我建议创建一个阅读器列表,并为每个阅读器创建一个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);
}
}https://stackoverflow.com/questions/26469423
复制相似问题