Каким должен быть подход к написанию службы опроса на c # для устройств с различным интервалом

У меня около 400 устройств ПЛК с интерфейсом Modbus, которые я хочу опросить и сохранить результат в базе данных MySQL. Пользователь настроит интервал опроса для каждого устройства, например, опрос температуры на 500 мс, треугольные волны на 1000 мс, параметры окружающей среды на 5000 мс и т. Д. Я сохранил всю эту информацию в базе данных.

Теперь я хочу написать службу Windows, которая будет делать следующее:

  1. Считайте параметры связи для каждого устройства из базы данных, например IP-адрес, адрес регистра, счетчик регистров и т. Д.
  2. Инициируйте поток для каждого устройства с определенным интервалом
  3. Этот поток будет продолжать опрашивать устройство и записывать значение в базу данных, пока служба не будет остановлена.

Теперь у меня вопрос, как реализовать отдельный поток для каждого устройства с определенным интервалом.

Я использую C # с библиотекой nModbus.


person Ashish Tilak    schedule 16.05.2015    source источник
comment
Я думаю, что в этом вопросе будет полезно подчеркнуть довольно ограниченный объем того, что вам нужно: многопоточность с настройками интервала опроса для каждого устройства. Можете ли вы соответственно редактировать? В противном случае это звучит почти так, как будто вы просите серьезный проект по кодированию.   -  person Nathan Tuggy    schedule 16.05.2015
comment
Многопоточность на 400 устройств? Надеюсь, у тебя чертовски компьютер.   -  person Ron Beyer    schedule 16.05.2015
comment
Лично вместо того, чтобы запускать поток для каждого устройства, я бы инициировал несколько базовых потоков, каждый из которых обрабатывает группу устройств. (Вы можете легко написать его для запуска четырех потоков, обрабатывающих 100 ПЛК каждый.) Каждый поток может иметь тайм-аут 10 мс, что дает вам очень высокую степень детализации, которая вам потребуется.   -  person Der Kommissar    schedule 16.05.2015
comment
@NathanTuggy: Думаю, этот заголовок выглядит более информативным.   -  person Ashish Tilak    schedule 18.05.2015
comment
@RonBeyer: Да, Рон. У меня есть сервер для этого. :)   -  person Ashish Tilak    schedule 18.05.2015
comment
@EBrown: Хорошее решение. Попробовал бы это и обновить.   -  person Ashish Tilak    schedule 18.05.2015


Ответы (2)


Есть много ресурсов о том, как опрашивать в интервале. C # 4.0 - потоки в интервале Вы можете перечислить по набор настроенных интервалов таймера и вращение потока для каждого.

С таким количеством параллельных потоков я бы предложил поставить их в очередь. Независимо от того, используете ли вы продукт очереди, такой как MSMQ, или настраиваемый потокобезопасный параллельный словарь для обработки очереди. Вот один ресурс по настраиваемой организации очередей: http://www.nullskull.com/a/1464/producerconsumer-queue-and-blockingcollection-in-c-40.aspx

Надеюсь, это поможет вам двигаться в правильном направлении.

person inspiredcoder    schedule 16.05.2015
comment
Спасибо! Это многообещающе, но мне нужно провести много исследований. Буду обновлять. - person Ashish Tilak; 18.05.2015

Вы можете использовать простой класс System.Timers.Timer; Вот пример кода

class Program
{
    static void Main(string[] args)
    {
        // Timer interval in ms
        // in your case read from database
        double timerIntervalInMs = 1000.00;
        var myTimer = new Timer(timerIntervalInMs);
        // I generally prefer to use AutoReset false 
        // and explicitly start the timer within the elapsed event.
        // Thus you can ensure that there will not be overlapping elapsed events.
        myTimer.AutoReset = false;
        myTimer.Elapsed += OnMyTimedEvent;
        myTimer.Enabled = true;
        myTimer.Start();
        Console.ReadLine();

    }

    private static void OnMyTimedEvent(Object source, ElapsedEventArgs e)
    {
        Console.WriteLine("On timer event");
        // Do work
        var timerObj = (Timer) source;
        timerObj.Start();
    }

}
person Pritam De    schedule 16.05.2015
comment
Это создаст только один таймер для одной задачи. Мне нужно опросить множество устройств в отдельных таймерах, которые будут опрашивать с заданным интервалом. Постараемся сделать это, реализовав несколько таймеров и обновив. - person Ashish Tilak; 18.05.2015