我会建议为每个读者创建一个读者列表,并为每个读者创建一个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);
}
}
您可以有一个读者列表。如果你需要添加一个新的,你可以很容易地添加到列表中。 – Pheonyx 2014-10-20 15:43:31
第三方库线程安全并且它是否实现并发访问?多少个IP地址?每个线程一个IP地址不会很好地扩展,线程池可能会更好。 – Polyfun 2014-10-20 15:53:50
第三方dll确实支持并发访问,因为我创建了2个“读取器”很好。我没有和第三方dll的开发者谈过,他们的文档有点欠缺,支持起来很慢。我测试它会更快,而不是问问他们。 – 2014-10-21 07:41:26