我正在使用通过以太网连接到RFID阅读器的第三方DLL,现在我已经使用以下内容对单个RFID阅读器无问题了:
private static readonly CRRU4 myReader = new CRRU4();
然后我传递了连接信息,其中包括IP地址和所需的不同参数。
现在我的问题是,我如何为多个IP地址执行此操作?我需要引用每个读取器来读取RFID标签并单独处理它们。
我考虑过骑自行车穿过每个RFID阅读器,连接进行读取然后断开连接,但这根据时间不可行。我想每秒提供更新,连接可能需要2-3秒才能完成。
多线程会为这样的事情工作吗?对于每个IP产生一个新线程并告诉它处理一个特定的IP?
答案 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);
}
}