Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
.NET 4.x

Программа, которая должна "вечно" опрашивать папку и при наличии в ней файлов их обрабатывать

13.09.2024, 15:11. Показов 2103. Ответов 24

Студворк — интернет-сервис помощи студентам
Приветствую всех!

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

Вот код 1-го таймера
C#
1
2
3
4
/
System.Threading.Timer _timer = new(TimerCall, null, (long)100, (long)30000);
_timer.InitializeLifetimeService();
Thread.Sleep(-1);
Вот код 2-го таймера
C#
1
2
3
4
5
6
System.Timers.Timer _timer = new();
_timer.Interval = 30000;
_timer.Elapsed += TimerCall!;
_timer.Start();
_timer.InitializeLifetimeService();
Thread.Sleep(-1)
Вот код рабочей части
C#
1
2
3
4
5
6
7
8
9
10
11
12
            void TimerCall(object sender, EventArgs e)
            {
                FlList = ReadFolder(path);
                Proceed();
                //FlList = null;
                Console.WriteLine("Working! " + DateTime.Now.ToString());
                using (StreamWriter lfw = File.AppendText(logfile))
                {
                    lfw.WriteLine(DateTime.Now.ToString() + " .");
                    lfw.Close();
                }
            }
Вывод в логфайл я добавил позже, демал, только консоль засыпает, но нет...

Естественно таймеры работают не вместе, но одинаково вылюбливают мозг. Программа не вылетает, просто перестает выполнять работу. Причем, когда я в тестовых целях отключил непосредственно рабочую часть, оставил только вывод в консоль - ничего не изменилось, по прежнему засыпает.
Это нативное свойство таймеров? И как это побороть?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.09.2024, 15:11
Ответы с готовыми решениями:

Переименовать папку в при наличии в ней определенного файла
Здравствуйте. Условие: if exist "%~dp0неизвестная папка\известный файл" rename "%~dp0неизвестная папка" "имя папки" ...

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

Программа должна по запросу выдавать сведения о наличии книг в библиотеке, упорядоченные по годам издания
Составить программу, которая содержит текущую информацию о книгах в библиотеке. Сведения о книгах содержат: номер УДК, фамилию и инициалы...

24
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
12.10.2024, 14:32  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от UseMuse Посмотреть сообщение
Blasphemie, скинь код)
В понедельник скину, код на работе.
1
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
14.10.2024, 19:24  [ТС]
UseMuse, держи.
Я его чуть почистил, там есть (были) штуки не для общего просмотра, но представление о программе получить можно.

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Timers;
 
namespace FileRepair
{
    internal class FileRepair
    {
 
 
        static void Main(string[] args)
        {
            
 
            List<string> OpenSource(string _fln)
            {
                List<string> _data = new(File.ReadAllLines(_fln));
                return _data;
            }
 
            void SaveResult(string path, List<string> _lts)
            {
                File.WriteAllLines(path, _lts.ToArray());
            }
            
            string[] ReadFolder(string path)
                {
                try
                {
                    return Directory.GetFiles(path, "*.csv");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    return null;
                }
            }
 
 
            string logdir = Directory.GetCurrentDirectory() + @"\Logs";
            string logfile = logdir + @"\" + DateTime.Now.ToString("dd.MM.yyyy") + ".log";
            string _tmpl;
 
            string[] FlList;
 
            string path = "";
            string Svpath = "";
 
            string _inifile = Directory.GetCurrentDirectory() + @"\rep.ini";
            INIFile Inii; //отдельный класс, неинтересный
            if (File.Exists(_inifile))
            {
                Inii = new(_inifile);
                path = Inii.IniReadValue("SetPath", "Path");
                Svpath = Inii.IniReadValue("SetPath", "SavePath");
                _tmpl = Inii.IniReadValue("Template", "Columns");
                Console.WriteLine("Read directory " + path);
                Console.WriteLine("Result directory " + Svpath);
                Console.WriteLine();
            }
            else
            {
                Console.WriteLine("Reading INI-file failed! \n Press ENTER to close...");
                Console.ReadLine();
                return;
            }
 
            if (!Directory.Exists(Svpath))
            {
                Directory.CreateDirectory(Svpath);
            }
            if (!Directory.Exists(path + @"\Original"))
            {
                Directory.CreateDirectory(path + @"\Original");
            }
            if (!Directory.Exists(logdir))
            {
                Directory.CreateDirectory(logdir);
            }
            if (!File.Exists(logfile))
            {
                File.Create(logfile).Close();
            }
 
            using (StreamWriter lfw = File.AppendText(logfile))
            {
                lfw.WriteLine("Program started at " + DateTime.Now.ToString());
                lfw.Close();
            }
 
            FlList = ReadFolder(path);
            Proceed();
 
            FileSystemWatcher watcher = new(path, "*.csv");
            watcher.EnableRaisingEvents = true;
            watcher.IncludeSubdirectories = false;
            watcher.Created += TimerCall;
            watcher.Error += ErrorCall;
 
            Thread.Sleep(-1);
 
 
            List<string> ProcessIt(List<string> _src, string _tmpl)  //собственно, обработка файла, не буду показывать :)
            {
                
            }
 
            void Proceed()
            {
                foreach (string fl in FlList)
                {
                    try
                    {
                        string nfln = Path.GetDirectoryName(fl) + @"\Original\" + Path.GetFileName(fl);
                        
                        List<string> list = OpenSource(fl);
 
                        List<string> rslt =  ProcessIt(list, _tmpl);
                        Thread.Sleep(1000);
                        
                        try
                        {
                            if(!File.Exists(nfln))
                                File.Move(fl, nfln);
                           else
                                File.Delete(fl);
 
                            string _tspt = Svpath + @"\" + Path.GetFileName(fl);
                            if (!File.Exists(_tspt))
                                SaveResult(_tspt, rslt);
                            else
                            {
                                Console.WriteLine($"File {_tspt} already done!");
                                using (StreamWriter lfw = File.AppendText(logfile))
                                {
                                    lfw.WriteLine(DateTime.Now.ToString() + ($" File {_tspt} was already done!"));
                                    lfw.Close();
                                    continue;
                                }
                            }
                            
                            
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message + " " + fl);
                            using (StreamWriter lfw = File.AppendText(logfile))
                            {
                                lfw.WriteLine(DateTime.Now.ToString() + "\n" + e.Message + "\nMoving " + fl + "\n***\n");
                                lfw.Close();
                            }
                            continue;
                        }
 
                        using (StreamWriter lfw = File.AppendText(logfile))
                        {
                            lfw.WriteLine(DateTime.Now.ToString() + " " + "Proceeded file " + fl);
                            lfw.Close();
                        }
 
                        Console.WriteLine(DateTime.Now.ToString() + " " + "Proceeded file " + fl);
                        //Thread.Sleep(100):
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message + " " + fl);
                        using (StreamWriter lfw = File.AppendText(logfile))
                        {
                            lfw.WriteLine(DateTime.Now.ToString() + "\n" + e.Message + "\nSaving " + fl + "\n***\n");
                            lfw.Close();
                        }
                        continue;
                    }
                }
                FlList = null;
            }
 
            void ErrorCall(object sender, EventArgs e)
            {
                Console.WriteLine("Error halndling file! Restatring service...");
                using (StreamWriter lfw = File.AppendText(logfile))
                {
                    lfw.WriteLine(DateTime.Now.ToString() + "Error halndling file! Restatring service...");
                    lfw.Close();
                }
                watcher.EnableRaisingEvents = true;
            }
 
                void TimerCall(object sender, EventArgs e)
            {
                Thread.Sleep(1000);
                FlList = ReadFolder(path);
                Proceed();
            }
 
        }
    }
}
1
-26 / 4 / 0
Регистрация: 26.09.2024
Сообщений: 128
16.10.2024, 15:34
Попробуй переодически отписывать события _timer.Elapsed -= TimerCall!; и перед новым запуском заново подписываться _timer.Elapsed += TimerCall!; Может лучше плясать от системных часов?
0
Добрый пёс
 Аватар для Blasphemie
120 / 86 / 37
Регистрация: 13.09.2020
Сообщений: 254
16.10.2024, 17:54  [ТС]
Цитата Сообщение от MechanicVV Посмотреть сообщение
Попробуй переодически отписывать события
А зачем? Оно и так работает. с 18.09 аж целых 15 файлов обработало!
Я хочу посмотреть, сколько мое творение проработает без обрушения, доживет ли до перезагрузки сервера, что мы обычно раз в квартал делаем.
0
Эксперт JavaЭксперт по электроникеЭксперт .NET
 Аватар для wizard41
3463 / 2784 / 575
Регистрация: 04.09.2018
Сообщений: 8,757
Записей в блоге: 3
16.10.2024, 18:00
Цитата Сообщение от Blasphemie Посмотреть сообщение
Я хочу посмотреть, сколько мое творение проработает без обрушения
так можешь до второго пришествия ждать, а серьезной ошибки не обнаружить.
Тестирование для этого есть - намного быстрее выловишь аварийные ситуации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2024, 18:00

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

Удалить строку при наличии в ней определенного сочетания символов
Как сделать так если строчка в тексте имеет кое какое сочетание букв , то вся строчка удаляется?

Программа должна копировать папку мои рисунки на диск много раз
помогите отредактировать Set Shell=CreateObject('wscript.shell') Set FileSystemObject=Create Object('scripting.FileSystemObject') ...

Написать программу, которая при установке создает БД, подключается к ней и работает с ней
Мне нужно сделать программу в Microsoft visual studio 2013, которая при установке создаст базу данных, сама к ней подключится и будет с ней...

Как заблокировать папку на время пока с ней работает программа?
Добрый вечер! Как с помощью Win32 API-функций заблокировать папку на время, пока с ней работает программа? Например, программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru