Ограничения класса секундомера .NET

Это может быть не совсем вопрос, не связанный с .NET. Я пишу приложение .NET для управления некоторыми гаджетами. Я отправляю команды на гаджет периодически (скажем, каждые 500 миллисекунд). Как только я отправляю команду, я запускаю таймер. (класс секундомера .NET)

Если гаджет не отвечает в течение, скажем, 10 миллисекунд, я снова отправляю команду. Если он отвечает, я продолжаю следить за состоянием гаджета, отправляя дополнительные команды и обрабатывая ответы.

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

Теперь я хочу отслеживать и контролировать потенциально тысячи этих гаджетов (может быть до 5000). Если я создам один объект для гаджета, я буду просматривать от 10 000 до 15 000 объектов секундомера, работающих параллельно. Я не уверен, как работают секундомеры, но я предполагаю, что они полагаются на аппаратный таймер или что-то в этом роде, чтобы отслеживать время.

У меня вопрос, может ли Windows обрабатывать такое большое количество секундомеров одновременно?


person Soundar Rajan    schedule 19.03.2009    source источник
comment
Знаете, мне стало любопытно: как вы собираетесь подключать 5000 устройств к одному компьютеру?   -  person Anton Tykhyy    schedule 20.03.2009
comment
Они связаны гирляндой! К интерфейсному блоку подключено 12 гаджетов. Каждый блок может быть последовательно соединен с 4 другими блоками и т. д. Каждый гаджет имеет уникальный адресуемый идентификатор в этой иерархии.   -  person Soundar Rajan    schedule 05.02.2010


Ответы (6)


Я бы порекомендовал переосмыслить этот дизайн. Во-первых, Секундомер просто делает то, что говорит — он действует как секундомер. Если вы хотите, чтобы событие запускалось через определенные промежутки времени, вам следует изучить различные классы Timer.

При этом я бы порекомендовал поделиться своими таймерами на гаджетах. Вы обнаружите, что все работает намного лучше и, вероятно, проще для написания и понимания, если у вас меньше таймеров, которые используются одним созданным вами планировщиком, и планировщик управляет гаджетами.

person Reed Copsey    schedule 19.03.2009

Секундомер - это не что иное, как переменная, содержащая результат вызова API Windows QueryPerformanceCounter(), он не имеет дополнительных затрат, пока он «работает». Остановка вызывает QueryPerformanceCounter() еще раз, так что производительность должна быть в порядке. Тем не менее, я согласен с Ридом Копси, вам нужно переосмыслить свой дизайн. При таком большом количестве гаджетов я бы начал думать о драйвере устройства.

person Anton Tykhyy    schedule 19.03.2009

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

Я не знаю о реализации класса Stopwatch, но могу представить, что они просто считывают значение таймера при запуске и остановке снова. Таким образом, экземпляр секундомера может практически не нуждаться в ресурсах.

Но просто попробуйте; сгенерируйте массив из нескольких тысяч экземпляров в цикле, запустите их и посмотрите, что произойдет.

person Daniel Brückner    schedule 19.03.2009

Подумайте о глобальной очереди, в которой хранятся ответы гаджетов, и об одном или нескольких потоках, которые запрашивают очередь и при необходимости повторно отправляют сообщения. Это будет работать лучше.

person devdimi    schedule 19.03.2009

использовать один источник времени для планирования событий с заданными интервалами

person Steven A. Lowe    schedule 19.03.2009

Класс секундомера довольно прост. Это не то, что "работает" все время. Когда вы говорите ему начать, он смотрит на системное время, а когда вы говорите ему приостановить, остановить, сбросить и т. д., он просто смотрит на системное время каждый раз, когда вы это делаете. Запрос ElapsedMilliseconds эквивалентен высказыванию (Processor.CurrentTicks - StartTicks) / TicksPerMillisecond. Это довольно просто, правда. Система может обрабатывать очень большое их количество.

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

person HypnoToad    schedule 10.10.2012