|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
||||||||||||||||
.NET 4.x Программа, которая должна "вечно" опрашивать папку и при наличии в ней файлов их обрабатывать13.09.2024, 15:11. Показов 1871. Ответов 24
Приветствую всех!
Совершенно нежданно столкнулся с проблемой: пишу консольную программу, которая должна "вечно" опрашивать папку и при наличии в ней файлов их обрабатывать. По ряду причин не могу оформить это как системный сервис, ео не думаю, что это бы помогло, все таки таймеры те же самые. Суть проблемы в том, что таймер перестает работать через некоторое время, примерно 90 минут. Вот код 1-го таймера
Естественно таймеры работают не вместе, но одинаково вылюбливают мозг. Программа не вылетает, просто перестает выполнять работу. Причем, когда я в тестовых целях отключил непосредственно рабочую часть, оставил только вывод в консоль - ничего не изменилось, по прежнему засыпает.Это нативное свойство таймеров? И как это побороть?
0
|
||||||||||||||||
| 13.09.2024, 15:11 | |
|
Ответы с готовыми решениями:
24
Программа, находящая папку по её полному "пути" и подсчитывающая количество файлов в ней Программа должна по запросу выдавать сведения о наличии книг в библиотеке, упорядоченные по годам издания |
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
|||||||
| 13.09.2024, 15:38 | |||||||
Сообщение было отмечено Blasphemie как решение
РешениеКасательно проблемы - скорее всего сборщик мусора убивает ваши таймеры, так как, подозреваю, что ссылки на них хранятся в локальных переменных, а не сохраняются где-то в статике, например. Это называется Eager Root Collection. Как вариант быстрого фикса, можно попробовать добавить одну строку:
Попробуйте потестировать.
2
|
|||||||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
|
| 13.09.2024, 16:03 [ТС] | |
|
IamRain, Да, таймер - живет в переменной в Main.
Благодарю за идею, буду пробовать с GC.KeepAlive(_timer); Вообще я думал в сторону какого-нибудь переполнения переменной, типа int кончился в миллисекундах, именно поэтому я (long) добавил, вроде как тогда таймер и жизненный цикл получает в int64, но не помогло, но int переполнить тоже та еще задача, это не полтора часа, а больше трех недель...
0
|
|
|
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
|
||
| 13.09.2024, 16:10 | ||
|
В .NET6-8 я немного с этим игрался, вроде такое больше нельзя воспроизвести.
0
|
||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
||
| 13.09.2024, 22:27 [ТС] | ||
|
IamRain,
К сожалению, мне приходится юзать Framework 4.8, мы не хотим на сервер еще и .NET корячить... Я бы предпочел, конечно, .NET Добавлено через 2 часа 35 минут ![]() Добавлено через 3 часа 33 минуты Хотя вроде бы и работает, буду в понедельник тестить. Не по теме: Йолки, я вообще админ! :D
0
|
||
|
|
|||
| 14.09.2024, 13:02 | |||
|
0
|
|||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
||
| 14.09.2024, 14:08 [ТС] | ||
|
Я, собственно, уже все переписал на FileSystemWatcher вместо таймера, буду пробовать. Вроде как работает, но я тестил только на локальных шАрах, на сетевых пока нет.
0
|
||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
|
| 17.09.2024, 09:15 [ТС] | |
|
На FileSystemWatcher все работает великолепно, никто не засыпает, сетевую шару читает без проблем!
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 18.09.2024, 17:29 | ||
|
Из главного: 1. Если случится какой-нибудь глюк с сетью, то FSW так же молча перестанет генерировать события. Обрабатывайте событие Error, в нем проверяйте/логгируйте исключение и запускайте прослушку заново. Запуск прослушки (EnableRaisingEvents = true) тоже может бросить исключение. 2. Для хранения полученных уведомлений до их обработки используется буфер ограниченного размера — если происходит много изменений в короткий промежуток времени, то он может переполниться и вы не получите все уведомления. Сводите время обработки событий к минимуму, в идеале все что они должны делать — это добавлять полученную информацию в очередь, которая уже обрабатывается отдельным потоком (ConcurrentCollection или TPL Dataflow в этом потогут). Если поток изменений такой, что даже это не помогает, то можно увеличить размер внутреннего буфера (свойство InternalBufferSize), но сильно не переусердствуйте — память под него выделяется в невыгружаемом пуле — там же, где живут драйверы и ядро ОС. 3. Некоторые действия вроде вырезать/вставить генерируют событие Renamed вместо Changed/Created — его тоже имеет смысл обрабатывать. 4. В некоторых случаях одно и то же событие генерируется дважды.
4
|
||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
||||
| 18.09.2024, 18:01 [ТС] | ||||
|
В первую очередь огромное спасибо за советы!
Если у меня Created дважды создастся - там тоже try / except, на случай, если вдруг сеть отвалится именно в этот момент.
0
|
||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 19.09.2024, 10:46 | |||
|
Если не отлавливать разрыв соединения в обработчике Error, то о следующем файле вы уже не узнаете. Лучше его "включать" в цикле с ожиданием или использовать библиотеку вроде Polly для автоматического повтора.
0
|
|||
|
|
|
| 19.09.2024, 12:51 | |
|
Если FSW обернуть в нормальную функциональность, с проверками и всем таким, то он будет без проблем работать "вечно".
Всего лишь раз его пришлось использовать для мониторинга сетевых папок (как раз!) и выполнения тех или иных действий - работает уже третий год без замечаний..
1
|
|
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
|||||||
| 19.09.2024, 15:58 [ТС] | |||||||
![]() А обработчик ошибок тогда зациклится, я полагаю, до тех пор пока watcher не взведется... Т.е.
Или я не прав?
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 19.09.2024, 17:10 | |||
|
0
|
|||
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
||
| 19.09.2024, 17:48 [ТС] | ||
Да и размер программы критичен, я прямо вспоминаю восьмидесятые, когда программа размером в аж целый мегабайт была непозволительной роскошью...
0
|
||
|
|
|
| 19.09.2024, 17:54 | |
|
0
|
|
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
|
| 19.09.2024, 18:20 [ТС] | |
|
0
|
|
|
Добрый пёс
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
|
|
| 12.10.2024, 10:12 [ТС] | |
|
Докладываю: прога работает уже около месяца, пока все в порядке - ни коннект не теряет, ни память не жрет.
Обрабатывает от 1 до 5 файлов в неделю, как и предполагалось.
0
|
|
|
154 / 154 / 60
Регистрация: 11.01.2016
Сообщений: 1,325
|
|
| 12.10.2024, 14:22 | |
|
Blasphemie, скинь код)
0
|
|
| 12.10.2024, 14:22 | |
|
Помогаю со студенческими работами здесь
20
При запуске с помощью runas программа запускается, но не видит файлов которые должна использовать Удалить строку при наличии в ней определенного сочетания символов Программа должна копировать папку мои рисунки на диск много раз Написать программу, которая при установке создает БД, подключается к ней и работает с ней Как заблокировать папку на время пока с ней работает программа? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
|
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y
Z4Tv2zpXVVo
https:/ / github. com/ shumilovas/ med2. git
|
|
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа.
В качестве фильтра для отбора справочника служит группа номенклатуры.
Отбор по наименованию группы. . .
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит значение перечислений.
/ / Событие "НачалоВыбора" реквизита на форме. . .
|