2014-10-20 2 views
0

Я использую стороннюю DLL, которая подключается к считывателю RFID через ethernet, теперь у меня это работает без проблем для отдельного считывателя RFID, используя следующее:Как создать экземпляр класса во время выполнения в C#

private static readonly CRRU4 myReader = new CRRU4(); 

Затем я передаю ему информацию о соединении, которая включает в себя IP-адрес и различные параметры.

Теперь, мой вопрос: как мне это сделать для нескольких IP-адресов? Мне нужно обратиться к каждому читателю, чтобы читать метки RFID и обрабатывать их отдельно.

Я подумал о прохождении через каждый считыватель RFID, подключив чтение, а затем отсоединение, но это невозможно по времени. Я хочу предоставлять обновления каждую секунду, подключение может занять 2-3 секунды.

Будет ли многопоточная работа для чего-то подобного? Для каждого IP-порождения новый поток и скажите ему обрабатывать определенный IP-адрес?

+0

У вас может быть список читателей. Вы можете добавить в список довольно легко, так что если вам нужно добавить новый, вы можете. – Pheonyx

+1

Безопасен ли поток сторонних библиотек и реализует ли он одновременный доступ? Сколько IP-адресов? Один IP-адрес для потока не будет масштабироваться очень хорошо, пул потоков может быть лучше. – Polyfun

+0

сторонняя dll поддерживает параллельный доступ, так как я создал 2 «читателей» в порядке. Я не разговаривал с разработчиками сторонней DLL, и их документации несколько не хватает, и поддержка медленнее, если не сказать больше. Мне было бы легче проверить это, а не спрашивать их. –

ответ

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); 
    } 
}