170 похожих чатов

🆘 Help 🆘 Есть форма со списком отчетов, где есть DataTable(documentId,

ApiType, documentStatus) который выводится в DataGridView.
Нужно обновлять статусы документов через две API, пока не получу конечный статус (Обработан с ошибкой / Обработан). В одной API 7 возможных статусов, в другой 10.
Документ может принадлежать только к одному из двух API!
Есть ограничения по частоте запроса в 1 минуту для каждого из методов API: т.е. отправили 1ым методом - ждем минуту, чтоб воспользоваться им снова. Аналогично и для второго метода.

Разделил на два Thread: один для 1-й API, второй для 2-й API, c циклом while (isFormRunning).
В первом Thread через LINQ выбираю по ApiType записи для первой API.
Во втором Thread аналогично для второй API.
Если выбранный список пуст, то завершаю поток, чтоб он не крутил в бесконечном цикле перебирая все записи по условию LINQ, тем самым нагружая сис-му.
Если в списке что-то есть -> выполняю запрос -> жду минуту -> если есть ещё что-то -> выполняю запрос -> если ничего нету -> завершаю поток.

Проблема. Планирую вынести это в отдельный поток при старте программы, сделать глобальную таблицу, в которую при отправке отчета будут добавляться записи. Как мне переделать логику? Например с текущей логикой, если программа запуститься -> обработает всё что там есть -> thread завершится -> отправить отчет -> ??? thread уже завершен.
Проверять жив ли thread, и если нет, то запускать новый?

А если он жив -> вставим отчет. А рабочий thread в этот момент обрабатывает последний отчет и завершается. Что делать? Проблемка получается... фигня значит мое решение.

У кого есть идеи? Может кто-то делал что-то подобное?

26 ответов

25 просмотров

Звучит как HostedService с очередью внутри

А твоя api возвращает статус только для 1 документа или для пачки сразу? И в целом я бы ушёл от потоков. Сделал бы очередь для обновления. Эту очередь бы обрабатывал по таймеру. Для первого приближения Если твоя апиха может 1 документ за раз перемалывать, то я бы вообще ушёл от автоматического обновления статуса, т.к. бессмысленно. А сделал тычку на обновить, которая обновляет статус по требованию (если можно послать запрос, то посылает, если нельзя, то просто ничего не делает)

Eugene- Автор вопроса
Anton 『被遗忘的社会』
А твоя api возвращает статус только для 1 документ...

API не моя, а "Честного знака", точнее REST API. Через HttpClient взаимодействую. Пачкой нельзя отправлять((

Eugene- Автор вопроса
Лев
Звучит как HostedService с очередью внутри

А решение не для ASP.NET можно?

Мне кажется тут System.Reactive может пригодится (Throttle, OnNext, OnCompleted)

Eugene
А решение не для ASP.NET можно?

HostedService не связан с асп

А как твои треды понимают, что надо запуститься и сходить за статусами?

Eugene- Автор вопроса
Eugene
По старту формы

И пока форма работает - надо получать статусы?

Eugene- Автор вопроса

Да, сейчас именно так работает. Но далее надо будет переделать, чтобы это было в фоне с самого старта программы. И когда происходит отправка нового документа посредством этого же ПО, будет добавлен в таблицу новый документ, который нужно обрабатывать

Eugene
Да, сейчас именно так работает. Но далее надо буде...

Тогда запускай HostedService или джобы какие-нибудь. Кварц, хенгфаер или самописную

Eugene- Автор вопроса
Ralsei
Тогда запускай HostedService или джобы какие-нибуд...

Можно пожалуйста, пример использования для моего случая? Никогда не работал с HostedService. Может знает ссылку на материал (не MSDN) где применение на практике

Eugene- Автор вопроса
Ralsei
У тебя десктоп?

.NET Framework 4.7 WinForms

Eugene
Можно пожалуйста, пример использования для моего с...

А core рассматривается? Или только net Framework? Если что вот - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-7.0&tabs=visual-studio

Eugene
.NET Framework 4.7 WinForms

Тогда джобы делай. Кварц - самое простое

Eugene
.NET Framework 4.7 WinForms

Либо как тебе советуют - https://www.quartz-scheduler.net/

Eugene- Автор вопроса
Nick M.
А core рассматривается? Или только net Framework? ...

Пока что WinFroms. Ещё порт на Core не делали. Дедлайны жмут, времени нет. Порт сложно делать с NET Framework на .NET?

Eugene- Автор вопроса
Eugene
Пока что WinFroms. Ещё порт на Core не делали. Дед...

Зависит от приложения, обычно довольно просто

Eugene- Автор вопроса
Ralsei
Тогда джобы делай. Кварц - самое простое

А как это должно будет работать? На словах примерно чтоб понимать по какому пути идти

Eugene
А как это должно будет работать? На словах примерн...

Но имхо я бы сервис сделал лучше, это не так сложно, а кварц оверкил в данной ситуации

Eugene- Автор вопроса

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
Я хочу запустить свой проект в тг. Что-то между пирамидой и майнилкой. Еще подобного ничего не было. Уникальная идея. Нужен именно не бот, а приложение. С ввод, выводом тон...
Павел А.
6
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
14
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
How to create an OS in C? what to study?
Linus
18
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
Реально в одиночку написать игровой движок на Си?
ㅤ (SVO)
11
Карта сайта