|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Привет. Появился вопросик, из разряда философии. На примере одно сервиса: отдельно от основной деятельности сервиса, имеется задачка периодически делать дополнительную работу - проверять shared папку на файлы и их обрабатывать. Так вот. Я думаю - как эффективней это бы реализовать ? 1. Мне в принципе не нравится идея запустить отдельный поток, который будет бездельничать, но периодически просыпаться и работать - постоянно занимая поток для себя (ну по типу Thread.Sleep - когда поток бесполезно висит) 2. Я хочу улучшить предыдущий вариант. Если прикрутить async может получится ! Вместо того, чтобы впадать в просто sleep до следующей итерации - можно впадать в task.delay с помощью await. 3. Основной рабочий поток, периодически сам создает task (через некоторое количество итераций; или проверяя по отрезку времени - что пора запустить поток для задачки; или вообще при каждой итерации вызывать метод вспомогательного класса, а он уже смотрит и решает - пора ли ему работать, и если нужно запустить отдельный поток) В целом мне нравится идея со вторым вариантом. И мне кажется это будет очень эффективно. Примерный код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
В принципе это можно вынести в отдельный класс - которому будет передаваться Action для выполнения периодической задачи. Что думаете ? Главный вопрос - не будет ли тут простоя потока ? Больше всего я не хочу, чтобы была такая картина: работа 100мс....sleeeeeeeep 3 минуты (держим поток).....работа 100 мс....sleeeep(с удержанием потока 3 минуты)..... Насколько я понимаю, применение await как раз позволит потоку освободится в пул и все будет максимально эффективно (как бы это еще подтвердить - графиками или другими средствами). Хочется, чтобы задача выполнялась по таймауту - а в свободное время отдавала поток в пул и не отбирала ресурсы. Будет работать задумка ? Будет ли она эффективна ? Или есть решения получше ? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 19:55 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Вот код. В студии работает отлично. Нужно лишь понять эффективен ли он ? Не простаивает ли поток ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 21:08 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
ProBiotek, Код: c# 1.
Номер потока меняется. Имхо, если нужно работу выполнять периодически, то проще использовать таймер. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 21:28 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Если нет явных сигналов и возможности использовать WaitHandle, по мне вполне вариант. Единственное, я не рекомендую ставить async/await без надобности, если всего один Task, то его можно вернуть напрямую. Да и лишнее отслеживание наличия контекста синхронизации, думаю ни к чему, рекомендую ставить ConfigureAwait(false). Скажем, так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 10:21 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
ProBiotekПривет. делать дополнительную работу - проверять shared папку на файлы и их обрабатывать. Timer самый то, что нужно. Зачем все усложнять? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 10:31 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Обычный windows сервис + Quartz.net ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 10:51 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Arm79Обычный windows сервис + Quartz.net Не вариант... Убивает элемент "творчества" в работе превращая её в рутину... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 12:19 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
petalvikProBiotek, Код: c# 1.
Номер потока меняется. Имхо, если нужно работу выполнять периодически, то проще использовать таймер. а да... чот я про таймеры не подумал :) Решил сделать велосипед. КОНЕЧНО же меняются потоки :) async/await берет поток из пула и возвращает его при ожидании. В этом его вся суть. В отличае от какого нибудь Sleep, который держит поток пока слипает. async/Await возвращает поток в пул - где его может взять другой async/await. В итоге один поток может обслужить под сотню параллельных обработчиков - если они делают очень мелкую работу (10-50 мс), а остальное время слипают через Task.Delay. И если заменить Task.Delay на Thread.Sleep, производительность мгновенно упадет с 100-300 одновременно работающих потоков, до 4-8 (сколько ядер в системе) ! ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 12:31 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
PS. А какого черта Concurrency Visualizer не входит в VS 2013 по умолчанию ? Я в шоке, что приходится его ставить отдельно. Забыл вот - и пол часа тыкал в менюшках, искал его. Нужно разобратся теперь как его использовать и анализировать его показания. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 12:36 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Ilya81 рекомендую ставить ConfigureAwait(false). Точно. Конечно же ) Спасибо. В исходниках C#6 код, который работает с asunc/await он весь там напичкан ConfigureAwait под завязку. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 12:38 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Arm79Обычный windows сервис + Quartz.net Quartz.net - в первый раз о нем услышал... Очень заинтересовало, спасибо. Хорошая штука ? Много где нашли применений ? Собственно, в чем разница Quartz.net от обычного таймера, к примеру ? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 13:23 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 13:57 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
ProBiotekArm79Обычный windows сервис + Quartz.net Quartz.net - в первый раз о нем услышал... Очень заинтересовало, спасибо. Хорошая штука ? Много где нашли применений ? Собственно, в чем разница Quartz.net от обычного таймера, к примеру ? Если рассматривать в контексте движения, какая разница между колесом и автомобилем? Если колесо, то чтобы оно ехало куда надо и как надо, нужно поверх него много что накрутить. А автомобиль - он может ехать на гораздо большие расстояния, но ему нужен бензин, водитель, + куча попутных действий. Зато и поездка комфортнее. В общем, кварц.нет на хостинге службы для организации каких либо работ по расписанию или через заданные интервалы времени - это самое то. Особенно если учесть, что он понимает формат cron ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 14:16 |
|
Какую бы конструкцию тут можно придумать ?
|
|||
---|---|---|---|
#18+
Нахлобуч ThreadPool.RegisterWaitForSingleObject А чем этот метод лучше обычного таймера ? Обычный таймер, вроде, тоже для своего выполнения использует поток из пула. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.02.2015, 15:51 |
|
|
start [/forum/topic.php?fid=20&msg=38871768&tid=1401943]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 147ms |
0 / 0 |