Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330

Фоновые процессы со своими настройками из View

05.12.2023, 13:44. Показов 622. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приложение WPF+Blazor.

MAUI не получилось, так как часть кода переносится из Blazor Server Side и что-то там не поддерживалось, не запускалось (не помню что), а WPF запустилось.


Задача вот такая.
Допустим приложение создаёт бекапы базы данных, и восстановление из бекапов.

На одной из страниц (view) приложения можно это делать вручную.
На другой можно задать время автоматического бекапа по указанным дням, времени.

Эти таски по бекапам будут постоянно добавляться/удаляться.



Как реализовать запуск этих таск в фоне после запуска приложения?
То есть не важно на какой мы странице (view) нужно чтобы эти таски работали каждый в своё назначенное время.

У меня на ум приходит только что-то похожее на Locator в WPF.
То есть объект которые есть всегда и везде.

И если при запуске хоть немного представить могу, что запустил объект и добавил его в List локатора, а вот как в работающем приложении добавить/удалить ещё один фоновый процесс.

Добавлено через 7 минут
Придумал пример проще.

Допустим есть почтовый клиент (программа) в которую можно задать неограниченное количество ящиков, но интервал проверки IMAP4 можно задавать для каждого email свой.

В любой момент мы можем удалить email, или добавить новый, и установить свой интервал.


И ещё уточнение.
При всём при этом у приложения есть EF с базой данных, и у каждого (потока | таски | фонового процесса) есть ещё своя БД, подключение к которой задаётся на странице настройки этой таски.


Может есть какой-то паттерн для этой задачи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.12.2023, 13:44
Ответы с готовыми решениями:

Фоновые процессы загружают ЦП на 100%
Доброго времени суток, возникла такая проблема: после активирования Office KMS-ом появились неназванные процессы, которые загружают цп до...

Планировщик создает фоновые процессы
Здравствуйте! Планировщик заданий любой файл запускает не как приложение, а как фоновый процесс, т.е. невидимо. Даже если галочка...

Как отключить фоновые процессы?
Как отключить фоновые процессы, например Word? Через Process не получается.

13
Эксперт .NET
 Аватар для Usaga
14132 / 9352 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
05.12.2023, 13:45
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Может есть какой-то паттерн для этой задачи?
Windows-служба в которой крутится Quartz?
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
05.12.2023, 13:51  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Windows-служба в которой крутится Quartz?
Спасибо. Похоже то что надо. Пойду читать.
0
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
06.12.2023, 22:15  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Windows-служба в которой крутится Quartz?
Правильно ли я понял работу этого зверя?


Есть бд, в которой около 100 объектов, нужно запустить их все в фоновых задачах.
Время жизни, пока живёт приложение.
При закрытии приложения, ждём выполнения каждой Job до логического завершения.

Запускаем StarterJob раз в минуту, и внутри StarterJob.Execute формируем новую задачу WorkerObjectJob с уникальным именем, и бесконечным выполнением. WorkerObjectJob запускаем один раз.

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
public class StarterJob : IJob
{
    private ISchedulerFactory _schedulerFactory;
    public StarterJob(ISchedulerFactory schedulerFactory)
    {
        _schedulerFactory = schedulerFactory;
    }
 
    public async Task Execute(IJobExecutionContext context)
    {
        string key = Data.GetRandomName;
 
        if (key is not null)
        {
            var job = JobBuilder.Create<WorkerObjectJob>()
                .WithIdentity(key, nameof(WorkerObjectJob))
                .Build();
 
            var trigger = TriggerBuilder.Create()
                .WithIdentity(key, nameof(WorkerObjectJob))
                .StartAt(DateTimeOffset.Now.AddSeconds(10))
                .WithSimpleSchedule(x => x
                    .WithRepeatCount(0))
                .Build();
 
            var scheduler = await _schedulerFactory.GetScheduler();
 
            await scheduler.ScheduleJob(job, trigger);
        }
 
        await Task.CompletedTask;
    }
}
 
public class WorkerObjectJob : IJob
{
    private Worker _worker;
    public WorkerObjectJob(Worker worker)
    {
        _worker = worker;
    }
 
    public Task Execute(IJobExecutionContext context)
    {
        var jobKey = context.JobDetail.Key;
 
        if (_worker.CheckDataBase(jobKey.Name))
        {
            while (!context.CancellationToken.IsCancellationRequested)
            {
                // Это выполняем до тех пор, пока не отменим через Job по уникальному имени jobKey.Name
                _worker.Go();
            }
        }
 
        return Task.CompletedTask;
    }
}
 
public class Worker
{
    private DbContext _context;
    public Worker(DbContext context)
    {
        _context = context;
    }
 
    public bool CheckDataBase(string name)
    {
        if (_context.User.IsExists(name))
        {
            return true;
        }
 
        return false;
    }
 
    public void Go()
    {
        // Выполняем цикл работы к примеру 5 минут один цикл, но его нужно выполнять постоянно.
    }
}
В итоге нужно чтобы объект Worker работал пока его не остановят.

Таких объектов будет около 100, но может и больше, один цикл Go() будет несколько раз читать/писать БД, и делать запросы http как к внешним серверам, так и к api.

На сколько вообще правильная реализация?
И выдержит ли Quartz такую нагрузку, где задача не заканчивается?
0
Эксперт .NET
 Аватар для Usaga
14132 / 9352 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
07.12.2023, 05:41
BeginnerCoderCS, насколько это всё правильно мне сказать сложно. Я не вижу всей картины в целом. Вроде бы ничего криминального не бросается в глаза.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
// Выполняем цикл работы к примеру 5 минут один цикл, но его нужно выполнять постоянно.
А вот тут надо быть осторожным. Насколько я понимаю, у тебя в воркере используется EF. А экземпляры его контекста удерживать вечно очень и очень не рекомендуется. Ибо чревато.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
И выдержит ли Quartz такую нагрузку, где задача не заканчивается?
Кварц - только планироващик. Он никакую нагрузку не несёт. Тут надо собирать прототип и смотреть глазами.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
07.12.2023, 07:43  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
А вот тут надо быть осторожным. Насколько я понимаю, у тебя в воркере используется EF. А экземпляры его контекста удерживать вечно очень и очень не рекомендуется. Ибо чревато.
Да, EF в DI добавлен как Singleton, а Worker как Scoped.
Чем чревато? методы почти все Async в EF (те которые возможно)

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


Ну и вот в правильности такого подхода сомневаюсь.
C#
1
2
3
4
5
6
7
    
public Task Execute(IJobExecutionContext context)
{
       while (!context.CancellationToken.IsCancellationRequested)
       {
        }
}
Но если не в Quartz, то придётся свой како-то манагер городить, поэтому и подумал что пусть там крутится.
0
Эксперт .NET
 Аватар для Usaga
14132 / 9352 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
07.12.2023, 07:54
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Чем чревато?
Забиванием кеша (тормоза) и исключениями при конкурентном (из разных потоков) обращении через один экземпляр контекста. Поэтому так делать не надо.

Кстати, в случае с фоновыми сервисами Singleton и Scoped - это одно и тоже. Запросов-то никаких нету, scope - весь срок жизни приложения.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Ну и вот в правильности такого подхода сомневаюсь.
Ну, тут сказать ничего не могу. Лучше вместо цикла периодически создавать воркеры, которые один раз отработают и как мистер Миссикс отойдут в мир иной. Меньше проблем будет потенциальных.
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
07.12.2023, 08:13  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Забиванием кеша (тормоза) и исключениями при конкурентном (из разных потоков) обращении через один экземпляр контекста. Поэтому так делать не надо.
Да где же этот EF можно использовать ))

Это проблема именно EF?
Если EF оставить только для управления структурой БД, а работу с данными реализовать на linq2db (у него же нет кеша) это решит проблему с работой из разных потоков? Или в принципе подход не правильный, и не зависит от ORM?
0
Эксперт .NET
 Аватар для Usaga
14132 / 9352 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
07.12.2023, 08:22
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Да где же этот EF можно использовать ))
Поиграться, на небольших проектах)

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Это проблема именно EF?
С кешем - да, проблема EF'а. С конкурентым доступом - со стороны ADO.NET.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Если EF оставить только для управления структурой БД
Если речь о миграциях, то можно использовать специальные средства, типа LiqueBase.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Или в принципе подход не правильный, и не зависит от ORM?
В принципе. Тут EF менять не обязательно. Просто нужно иметь в виду его особенности и ограничения, как и технологий на которых он работает. Ну, как и с любой технологией.
1
 Аватар для Andrey-MSK
3328 / 2215 / 387
Регистрация: 14.08.2018
Сообщений: 7,454
Записей в блоге: 4
07.12.2023, 08:50
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Да, EF в DI добавлен как Singleton
Попробуйте запустить его как Transient (если у вас Microsoft DI). Это вызов по запросу и при завершении активности сервис закрывается. При повторном к нему обращении создаётся новый экземпляр, даже если предыдущий не завершил работу. В таком случае у вас всегда будет новое соединение с БД со всеми вытекающими обстоятельствами (очистка кеша, конкурентные обращения к одному соединению и т.д.).
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
07.12.2023, 09:03  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Тут EF менять не обязательно. Просто нужно иметь в виду его особенности и ограничения, как и технологий на которых он работает.
Цитата Сообщение от Usaga Посмотреть сообщение
Лучше вместо цикла периодически создавать воркеры, которые один раз отработают и как мистер Миссикс отойдут в мир иной.
Дело в том, что там очень много таймеров, которые "особым" образом должны работать каждый со своим изменяемым диапазоном.
Постоянный перезапуск воркера ещё более усложнит логику работы.

Но и так же при создании самого воркера идут достаточно ресурсоёмкие процессы.
Грубо скажем стартовые 2-4 минуты работы воркера достаточно тяжёлые, а весь остальной процесс занимает где-то 20% ресурсов от стартового, поэтому его не очень желательно останавливать что за зря.

А проблемы с кешем и конкурентностью от EF может быть и в эти 2-4 минуты.

Ещё уточнение.
Внутри этого потока есть общий для всего приложения контекст EF.
Но так же внутри при запуске воркер, подключается ещё к своей личной БД, то с ней тоже могут быть проблемы те же что и с общей (кеш и т.д.), или же эти проблемы только в общем контексте могут быть?

Вообще выходи так, что этот поток, это типа отдельное консольное приложение, у которого своя работа. Но периодически нужно и на View отправлять данные, ну или скорее всего из View их брать, для периодического отображения процесса.

p.s. Допустим воркер это отдельный телеграм-бот, который должен быть постоянно запущен, и отображать свои текущие действия администратору.
Куча ботов за которыми нужно поглядывать. У каждого своя БД, и общая БД.

Добавлено через 5 минут
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
(если у вас Microsoft DI)
Да, родное DI.

У меня вот так добавляется
C#
1
services.AddDbContext<AppDbContext>
Я так понимаю это Singleton?
0
Эксперт .NET
 Аватар для Usaga
14132 / 9352 / 1350
Регистрация: 21.01.2016
Сообщений: 35,153
07.12.2023, 09:05
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Но и так же при создании самого воркера идут достаточно ресурсоёмкие процессы.
Тогда вокрер не должен в конструкторе запрашивать экземпляр контекста. А должен запрашивать IServiceLocator, через который и получать контекст. Причём получать на какое-то время.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Внутри этого потока есть общий для всего приложения контекст EF.
Такого не должно быть.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
подключается ещё к своей личной БД, то с ней тоже могут быть проблемы те же что и с общей (кеш и т.д.)
Только если шарить такое подключение между потоками или удерживать неприлично долго.

Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
p.s. Допустим воркер это отдельный телеграм-бот, который должен быть постоянно запущен, и отображать свои текущие действия администратору.
Куча ботов за которыми нужно поглядывать. У каждого своя БД, и общая БД.
Тут главное не злоупотреблять контекстом EF'а, скором его жизни и владеющим им потоком.

Добавлено через 1 минуту
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Я так понимаю это Singleton?
Есть документация. Там сказано, что это - scoped. Что равносильно синглтону в фоновых процессах.
1
 Аватар для Andrey-MSK
3328 / 2215 / 387
Регистрация: 14.08.2018
Сообщений: 7,454
Записей в блоге: 4
07.12.2023, 09:28
Цитата Сообщение от BeginnerCoderCS Посмотреть сообщение
Я так понимаю это Singleton?
C#
1
2
3
4
5
6
public void ConfigureServices(IServiceCollection services)
{
    var connectionString = "connection string to database";
 
    services.AddDbContext<MyContext>(ServiceLifetime.Transient);
}
Transient 2 Specifies that a new instance of the service will be created every time it is requested
Вот так будет по запросу.

Добавлено через 1 минуту
BeginnerCoderCS, AddDbContext<TContext>(IServiceCollection, ServiceLifetime, ServiceLifetime)
ServiceLifetime Enum
1
9 / 6 / 3
Регистрация: 10.01.2020
Сообщений: 330
11.12.2023, 01:56  [ТС]
Quartz не хочет создавать новые задачи, если там крутятся бесконечные. Ну по крайней мере у меня.

Ну и вообще слишком много зависимостей, и так как у каждого потока своя БД, не получается у меня использовать полноценно DI сервисов от DbContext.

Поэтому думаю вместо Worker, создать отдельное консольное приложение (пусть будет WorkerApp), и запускать из основного WPF с передачей параметров для запуска нескольких разделённых копий, в которой для каждой можно создать свой DI и работать с сервисами от DbContext.

Нужно иметь возможность обмениваться инфой, как минимум запрашивать состояние о работе WorkerApp из WPF и возможности остановки из WPF нужный экземпляр приложения.


Ткните в примеры, может есть где-то реализации, где можно содрать опыт.

Стартовать консоли через Process или есть что-то правильнее?
C#
1
2
3
4
5
6
7
    var processStartInfo = new ProcessStartInfo
    {
        FileName = "WorkerApp.exe",
        Arguments = "",
    };
 
    Process.Start(processStartInfo);
Как минимум не пойму, где и что хранить в WPF для управления другими приложениями после их запуска, для дальнейшего обмена инфой и остановки консоли?
Пописался с gpt он мне рассказывает о синхронизации данных через файлы-сигналы, но это жесть конечно.
Ещё как я понимаю можно использовать сокеты, хоть их и не использовал никогда, но выглядит по-моему логичнее, чем отдельные файлы.


p.s. У каждого потока, или консольного WorkerApp обязательно своя БД.
На текущий момент, мне кажется что с использованием DI, даже с DbContextFactory не получается решить, поэтому пытаюсь отделить это в отдельный проект. Если это решается, то подскажите, лучше оставлю тогда потоки для Worker.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.12.2023, 01:56
Помогаю со студенческими работами здесь

Python, Django и фоновые процессы
Всем привет. Мне через сайт нужно запустить парсинг данных, естественно, парсинг может затянуться на неопределенный срок, и запущен он...

Не завершаютс фоновые процессы EXCEL.EXE
Доброго дня всем. Написал код, который конвертирует файл csv в xlsx с дальнейшей обработкой оного. После обработки закрываю...

Java Eclipse с Android SDK - фоновые процессы
Доброго времени суток. Вопрос по джава среде Эклипс, с Android SDK. Я работаю с несколькими ативностями (если быть точным, всего двумя, и...

Фоновые процессы при использовании System.Windows.Forms
Друзья подскажите пожалуйста! Нужно сделать проект с использованием System.Windows.Forms Для примера самое простое - форма на ней...

Как на Laravel запустить фоновые процессы в бесконечном цикле
Нужно запустить в фоне 3 процесса, каждый из которых должен будет перезапускаться через какое-то количество времени. Сделал 3 job'а, в...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru