Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработка списка в заданное время.


Автор: SmartBye 14.9.2010, 18:40
Проблема довольно абстрактная, вот только не знаю, как лучшее ее решить.
Есть некоторый список (не List, а абстрактный список)
Каждый элемент которого нужно обработать в определенное время, закрепленное за этим элементом.
Долго думал, как решить этот вопрос, надумалось только два решения, но, на мой взгляд они не очень совета:
1. Я пишу некоторый класс-менеджер, в котором хранится этот список (отсортированный по времени). Затем каждую секунду опрашиваю его из какого-то внешнего возбудителя (скажем, это будет Timer в WinForms) на предмет не пришло ли время первого события, т.е. то, которое имеет ближайшее время. Если пришло, то менеджер передает обработку этого элемента обработчику и выкидывает из списка (или ставит в конец) и таким же образом ожидаю времени следующего события.
Тут мне видятся такие проблемы:
  • Менеджер зависим от внешних факторов, например, таких как таймер, который будет его опрашивать, т.е. привязка к винформам
  • Ежесекундный (а скорее вего чаще, что бы не пропустить времени события) опрос менеджера постоянно будет терзать процессор (хоть и не много, но, по идее, будет), что не есть очень хорошо. Хотя не уверен существенна ли эта нагрузка.
2. Вынести обработку в отдельный поток, в котором список отсортируется по времени по возрастанию и между элементами списка будет просто исползоваться Thread.Sleep(интервал до обработки следующего списка), что бы дождаться времени следующего элемента.
  • С потоками я еще не работал, поэтому не знаю, хорош ли этот способ (если честно, то он мне пришел в голову, когда я вводил название темы).
  • Не нравится, что постоянно будет висеть в фоне спящий поток, но, опять же, я с потоками не работал, поэтому не знаю, хорошо это или плохо.

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

Автор: nmn 14.9.2010, 20:10
Цитата(SmartBye @  14.9.2010,  18:40 Найти цитируемый пост)
*

2. Вынести обработку в отдельный поток, в котором список отсортируется по времени по возрастанию и между элементами списка будет просто исползоваться Thread.Sleep(интервал до обработки следующего списка), что бы дождаться времени следующего элемента.

    * С потоками я еще не работал, поэтому не знаю, хорош ли этот способ (если честно, то он мне пришел в голову, когда я вводил название темы).
    * Не нравится, что постоянно будет висеть в фоне спящий поток, но, опять же, я с потоками не работал, поэтому не знаю, хорошо это или плохо.

ну как вариант, ничего плохого в принципе нет, синхронизацию только нужно правильно сделать

еще как вариант использовать Timer (хоть из Threading, хоть из WinForms), и после каждой обработки менять значение интервала, так чтобы в нужное время этот таймер сработал для следующего элемента

Автор: SmartBye 15.9.2010, 10:52
Т.е. второй способ будет наиболее оптимальный? Или лучше использовать таймер из потоков?

Автор: nmn 15.9.2010, 14:43
тут зависит от специфики задачи,  в частности как часто необходимо обрабатывать, как долго будет происходить обработка, что происходит во время обработки

если использовать Timer из WinForms, то тут нет проблем с синхронизацией (событие выполняется в том же потоке что и форма), но если обработка будет занимать много времени, то UI приложения будет подвисать

использование собственного потока и Threading.Timer примерно одинкаово, но если время на обработку одного элемента превысит время ожидания до обработки следующего потока, то Timer cоздаст новый поток, а при использовании собственного потока будет запаздывание (как поезд, если будет стоять на одной станции слишком долго то на следующую он прибудет с опазданием), так что если обработка элемента операция независимая то предпочтительнее использовать таймер, если зависит от обработки предыдущих элементов, то собственный поток
и конечно нельзя забывать о синхронизации при доступе к разделяемым ресурсам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)