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 ответов

74 просмотра

Звучит как 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
Да, сейчас именно так работает. Но далее надо буде...

Тогда запускай 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
Пока что WinFroms. Ещё порт на Core не делали. Дед...

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

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

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

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

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

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Oh sorry did you want it in Gunter's chains?
Martin Rys
15
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта