首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在运行时在C#中实例化一个类

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

Stack Overflow用户
提问于 2014-10-20 23:31:34
回答 1查看 142关注 0票数 0

我正在使用一个第三方DLL,它通过以太网连接到RFID读取器,现在我已经使用以下内容在单个RFID读取器上正常工作:

代码语言:javascript
复制
private static readonly CRRU4 myReader = new CRRU4();

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

现在我的问题是,对于多个IP地址,我如何做到这一点?我需要参考每个读取器来读取RFID标签,并分别处理它们。

我已经考虑过循环通过每个RFID读取器,连接进行读取,然后断开连接,但这在时间上是不可行的。我想提供每秒更新,连接可能需要2-3秒才能完成。

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

EN

回答 1

Stack Overflow用户

发布于 2014-10-20 23:56:35

我建议创建一个阅读器列表,并为每个阅读器创建一个Timer。类似于:

代码语言:javascript
复制
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
    }
}

并创建阅读器:

代码语言:javascript
复制
List<Reader> _readersList = new List<Reader>();
for all devices
    var reader = new Reader();
    reader.Connect(ipAddress, TimeSpan.FromSeconds(1));
    _readersList.Add(reader);

现在,每秒钟都会对每个读者进行轮询。

如果轮询/更新过程可能需要超过一秒的时间,则需要修改计时器更新过程,使其不允许并发条目。也就是说,如果一次轮询操作花费的时间超过一秒,计时器将再次触发,然后您将遇到两个线程试图轮询同一设备的问题。防止这种情况的最简单方法可能是使用Monitor

代码语言:javascript
复制
private object _updateLock = new object();
private void UpdateProc(object state)
{
    if (!Monitor.TryEnter(_updateLock)) return;
    try
    {
        // poll and update
    }
    finally
    {
        Monitor.Exit(_updateLock);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26469423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档