С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626

Посоветуйте по оптимизации периодического выполнения кода

25.05.2017, 15:54. Показов 2017. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня приложение. Нужно, чтобы код его выполнялся каждые полминуты. Сделал цикл while(true), ну и в нем проверяю, если прошло полминуты, то выполняю код, затем снова жду, когда полминуты пройдет. Все вроде хорошо, если машина многоядерная. Если одноядерная, то такой подход ведет к 100% загрузке проца и диким тормозам. Что в данном случае можно сделать? Чем заменить while(true)?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.05.2017, 15:54
Ответы с готовыми решениями:

Организация периодического выполнения задач на сервере
Здравствуйте. Есть сервер, и есть задача. Задача сервера следующая: сервер формирует несколько групп новостей (давайте для примера...

Посоветуйте по оптимизации сайта
Подскажите как можно оптимизировать, дайте конструктивную критику. Достаточна ли внутренняя перелиновка - или по вашему ему нет? сайт...

Задержка выполнения кода на время выполнения анимации
Пишу игру с видом пошагового боя. С каждым ходом, игрок выкладывает на доску новую фигуру. После того, как игрок выложил фигуру –...

22
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18248 / 14172 / 5366
Регистрация: 17.03.2014
Сообщений: 28,850
Записей в блоге: 1
25.05.2017, 16:23
Chizel, таймером заменить
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
25.05.2017, 16:55  [ТС]
OwenGlendower, а каким образом? Я просто подробнее опишу, чтобы вам понятнее было. Есть приложение, которое должно выполнять определенный метод каждые полминуты. Если сделать просто консольное или оконное приложение, то консоль или окно будут висеть на экране, что совсем не гуд, так как нерадивый пользователь может его и закрыть ненароком. Я сделал так. Создал приложение Windows Forms, удалил форму стандартную, ну и в program.cs удалил все три строки инициализатора и вывода формы на экран. Получилось то что нужно, приложение после запуска сидит себе в диспетчере задач и никому не мешает. Если теперь таймер поставить, то приложение просто закроется, так как ничто не блокирует завершение его работы. Посоветуйте, чем блокировать в таком случае?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18248 / 14172 / 5366
Регистрация: 17.03.2014
Сообщений: 28,850
Записей в блоге: 1
25.05.2017, 17:04
Лучший ответ Сообщение было отмечено Chizel как решение

Решение

Chizel, используй Application.Run() без аргументов и таймер который не требует окна (System.Threading.Timer или System.Timers.Timer).

Добавлено через 57 секунд
И возможно стоит подумать о переписывании программы в виде службы
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
25.05.2017, 17:20  [ТС]
OwenGlendower, спасибо, так получилось.
Цитата Сообщение от OwenGlendower Посмотреть сообщение
И возможно стоит подумать о переписывании программы в виде службы
вообще, я изначально и думал, про службу. Зарегистрировал ее в системе, но так у меня ничего и не запустилось. В итоге служба вываливалась с ошибкой по таймауту. Гуглил, но толком как исправить ситуацию не нашел. В итоге плюнул и пришел к решению с windows forms.
А что значит "переписать программу в виде службы"? Я думал это обычные приложения, а они как то по другому пишутся?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18248 / 14172 / 5366
Регистрация: 17.03.2014
Сообщений: 28,850
Записей в блоге: 1
25.05.2017, 17:24
Цитата Сообщение от Chizel Посмотреть сообщение
А что значит "переписать программу в виде службы"?
Именно это и значит. Переписать так чтобы её можно было установить как службу.

Цитата Сообщение от Chizel Посмотреть сообщение
Я думал это обычные приложения, а они как то по другому пишутся?
Учитывая что они а) запускаются вместе с системой б) имеют свои жизненный цикл в) имеют ряд особенностей вытекающие из первых двух пунктов, то назвать их обычными приложениями врядли можно.
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
25.05.2017, 17:33  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Учитывая что они а) запускаются вместе с системой б) имеют свои жизненный цикл в) имеют ряд особенностей вытекающие из первых двух пунктов, то назвать их обычными приложениями врядли можно.
Понял, ушел читать.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
29.05.2017, 11:39  [ТС]
OwenGlendower, а если я создам службу, то чем тут блокировать завершение работы? Я пробовал, как у консольного Console.ReadKey() использовать, не работает.
0
Эксперт .NET
 Аватар для Usaga
14110 / 9327 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
29.05.2017, 11:42
Chizel, так же: вечным сном в ожидании события от таймера или уведомления о завершении сервиса (OnStop()).
1
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
29.05.2017, 11:47  [ТС]
Usaga, а можно чуток подробнее?
0
Эксперт .NET
 Аватар для Usaga
14110 / 9327 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
29.05.2017, 11:54
Chizel, можно использовать такую вот штуку для засыпания\пробуждения. Дёргать Set() по таймеру или при получении уведомления OnStop() и выполнять нужное действие. Потом сбрасывать ивент и снова засыпать.
0
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.05.2017, 12:15
Цитата Сообщение от Chizel Посмотреть сообщение
Если одноядерная, то такой подход ведет к 100% загрузке проца и диким тормозам. Что в данном случае можно сделать? Чем заменить while(true)?
Можно было в него поместить Thread.Sleep(500); Этого достаточно что бы снять нагрузку. Я так в рендерере делал
0
Эксперт .NET
 Аватар для Usaga
14110 / 9327 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
29.05.2017, 12:19
Kill100, так себе совет, если честно.
0
 Аватар для Kill100
434 / 299 / 82
Регистрация: 11.12.2010
Сообщений: 1,209
29.05.2017, 12:26
Цитата Сообщение от Usaga Посмотреть сообщение
Kill100, так себе совет, если честно.
Для данного случая да. Но иногда вполне себе применимо
Написал вариант, что бы автор видел что у проблемы есть еще 1 вариант решения кроме таймеров
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
29.05.2017, 12:27  [ТС]
Usaga, вот сделал так, в итоге служба походу зависла при запуске, сейчас так и висит "Запускается" и ни остановить ее нельзя, ни перезапустить
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
    public partial class Service1 : ServiceBase
    {
        ManualResetEvent mre;
        public Service1()
        {
            InitializeComponent();
            mre = new ManualResetEvent(false);
        }
 
        protected override void OnStart(string[] args)
        {
            TimerCallback tm = new TimerCallback(Log);
            System.Threading.Timer timer = new System.Threading.Timer(tm, null, 0, 1000);
            mre.WaitOne();
        }
 
        protected override void OnStop()
        {
            mre.Set();
        }
 
        static void Log(object source)
        {
            LogErrors errors = new LogErrors();
            errors.WriteExceptionInFile("Проверка");
        }
    }
Создал ManualResetEvent, сделал, чтобы он ждал вечно WaitOne, сделал Set при останове службы, чтобы он завершил программу, что еще не так?
0
Эксперт .NET
 Аватар для Usaga
14110 / 9327 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
29.05.2017, 12:51
Chizel, вы смеётесь?..

Запускайте отдельный поток и в нём уже куролесьте. А из метода OnStart() возвращать управление нужно сразу же.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
29.05.2017, 12:56  [ТС]
Usaga, да я уже понял свою глупость. Думал с наскоку попробую, если заработает, то почитаю более вдумчиво. Сейчас читая уже понял, что нужно отдельный поток создавать, вся эта ManualResetEvent под отдельные потоки и заточена.
0
Эксперт .NET
 Аватар для Usaga
14110 / 9327 / 1349
Регистрация: 21.01.2016
Сообщений: 35,031
29.05.2017, 13:01
Chizel, в службе в любом случае нужно отдельный поток создавать. Основной поток, который вызывает OnStart() и OnStop() загружать нельзя. Это верно всегда, даже без всяких там ManualResetEvent.
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
29.05.2017, 13:37  [ТС]
Вот сделал отдельным потоком. В итоге служба запускается, работает, останавливается, но класс LogError должен создавать файл и писать в него логи каждую секунду. Когда это обычная программа была, то все работало, тут же не файл не создается. Что-то я не пойму это с ManualResetEvent я чего то намудрил или что?
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
    public partial class Service1 : ServiceBase
    {
        ManualResetEvent mre;
        public Service1()
        {
            InitializeComponent();
            mre = new ManualResetEvent(false);
        }
 
        protected override void OnStart(string[] args)
        {
            Task.Factory.StartNew(DoGood);           
        }
 
        protected override void OnStop()
        {
            mre.Set();
        }
 
        private void DoGood()
        {
            TimerCallback tm = new TimerCallback(Log);
            System.Threading.Timer timer = new System.Threading.Timer(tm, null, 0, 1000);
            mre.WaitOne();
        }
 
        private void Log(object source)
        {
            LogErrors errors = new LogErrors();
            errors.WriteExceptionInFile("Проверка");
        }
    }
0
32 / 15 / 5
Регистрация: 19.11.2014
Сообщений: 626
31.05.2017, 07:54  [ТС]
Написал тестовую службу, каждые десять секунд которая кладет в файл запись. Ну и при событиях остановки, запуска службы, перезагрузки компа запись в другой файл кладется. То что мне и требовалось. Никакой ManualResetEvents не нужен для этого.
Service1
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
    public partial class Service1 : ServiceBase
    {
        LogErrors e;
 
        public Service1()
        {
            InitializeComponent();
            e = new LogErrors();
        }
 
        protected override void OnStart(string[] args)
        {           
            e.WriteMessageInFile("Служба запущена");
        }
 
        protected override void OnStop()
        {
            e.WriteMessageInFile("Служба остановлена");
        }
 
        protected override void OnShutdown()
        {
            e.WriteMessageInFile("Перезагрузка");
        }
    }
LogErrors
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
    class LogErrors
    {
        public LogErrors()
        {
            Task.Factory.StartNew(WorkingTimer);
        }
 
        public void WorkingTimer()
        {
            TimerCallback tm = new TimerCallback(WriteTimerInFile);
            Timer timer = new Timer(tm, null, 0, 10000);
        }
        public void WriteTimerInFile(object source)
        {
            using(StreamWriter sw = new StreamWriter(@"C:\1\Лог таймера.txt", true))
            {
                sw.WriteLine("==================================================");
                sw.WriteLine(DateTime.Now);
                sw.WriteLine("Работает");
            }
        }
        public void WriteMessageInFile(string s)
        {
            using (StreamWriter sw = new StreamWriter(@"C:\1\События.txt", true))
            {
                sw.WriteLine("==================================================");
                sw.WriteLine(DateTime.Now);
                sw.WriteLine(s);
            }
        }
    }
Добавлено через 17 часов 14 минут
Может кто-нибудь подсказать, что не так с вышенаписанной службой? Работает минут 25, затем в Лог событий перестают записи складываться. Служба останется запущенной, в "Службах" написано, что она выполняется. Если службу остановить и снова запустить, то она снова работать начинает и в лог писать записи.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.05.2017, 07:54
Помогаю со студенческими работами здесь

Посоветуйте что-нибудь по оптимизации
Собственно вот сайт : http://smile.uaze.net/ Какие советы по оптимизации?

посоветуйте по оптимизации сайта по психологии
Здравствуйте, сайт: http://psotrajenie.ru Продвигаю его чуть меньше года, контент уникальный. Проект некоммерческий - денежных...

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

Засечь время выполнения (в ms) определённого кода или части кода
Доброго времени суток всем. Хотелось бы поинтересоваться у знающих людей. Как можно засеч время выполнения(в ms) определённого кода...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru