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 в этот момент обрабатывает последний отчет и завершается. Что делать? Проблемка получается... фигня значит мое решение.
У кого есть идеи? Может кто-то делал что-то подобное?
Звучит как HostedService с очередью внутри
А твоя api возвращает статус только для 1 документа или для пачки сразу? И в целом я бы ушёл от потоков. Сделал бы очередь для обновления. Эту очередь бы обрабатывал по таймеру. Для первого приближения Если твоя апиха может 1 документ за раз перемалывать, то я бы вообще ушёл от автоматического обновления статуса, т.к. бессмысленно. А сделал тычку на обновить, которая обновляет статус по требованию (если можно послать запрос, то посылает, если нельзя, то просто ничего не делает)
API не моя, а "Честного знака", точнее REST API. Через HttpClient взаимодействую. Пачкой нельзя отправлять((
А решение не для ASP.NET можно?
Core или фреймворк
Мне кажется тут System.Reactive может пригодится (Throttle, OnNext, OnCompleted)
HostedService не связан с асп
А как твои треды понимают, что надо запуститься и сходить за статусами?
По старту формы
И пока форма работает - надо получать статусы?
Да, сейчас именно так работает. Но далее надо будет переделать, чтобы это было в фоне с самого старта программы. И когда происходит отправка нового документа посредством этого же ПО, будет добавлен в таблицу новый документ, который нужно обрабатывать
Тогда запускай HostedService или джобы какие-нибудь. Кварц, хенгфаер или самописную
Можно пожалуйста, пример использования для моего случая? Никогда не работал с HostedService. Может знает ссылку на материал (не MSDN) где применение на практике
У тебя десктоп?
.NET Framework 4.7 WinForms
А core рассматривается? Или только net Framework? Если что вот - https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-7.0&tabs=visual-studio
Тогда джобы делай. Кварц - самое простое
Либо как тебе советуют - https://www.quartz-scheduler.net/
Пока что WinFroms. Ещё порт на Core не делали. Дедлайны жмут, времени нет. Порт сложно делать с NET Framework на .NET?
Зависит от приложения, обычно довольно просто
А как это должно будет работать? На словах примерно чтоб понимать по какому пути идти
Но имхо я бы сервис сделал лучше, это не так сложно, а кварц оверкил в данной ситуации
Обсуждают сегодня