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

27 просмотров

Звучит как 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- Автор вопроса

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

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

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
Я тут за тем, чтобы задать вопрос, так как не знаю ассемблер, учу с/с++. Короче, насколько дорога операция перехода в функцию при ее вызове? Дело в том, что в с++ есть макросы...
Максим Рябцев
12
А какие чаты вообще в ходу? Auto aim? И что еше
do you think you're better off alone? А
13
Привет, нужен совет старших товарищей. Есть глобальная переменная var DefaultDataFolder:string; инициализируем DefaultDataFolder:='a:\_OUT\'; есть примитивная процедур...
Max Otto
14
hello friends. Do you know how can I learn getx? I have a software project that I should deliver it up to 5 weeks later and I need to learn firebase too. I will be thankfull
AmirHossein Razavi
15
Доброе время суток! у меня тут иноды закончились. и понял почему по сути кстит, я периодически очищаю постгрес и сентри контайнер: postgres=# DELETE FROM nodestore_node WHER...
Юсиф Насиров
9
Вопрос. Теоретический. Есть список команд. Команды отправляю в обработку некой функции, по очереди. Разные команды могут давать разные результаты после обработки. В зависимос...
Serjone
7
lazarus-3.2.0/gtk, linux патч "имя проекта по умолчанию project1 -> prj" день добрый не нравится "именя проекта по умолчанию" (project1), к.раз приходится переименовывать (н...
livontiy
5
Коллеги, а в чём сейчас хорошо писать на перле, в смысле ide? Пробовал в идее с плагином, подсветка есть, даже какие-то предупреждения есть, но рефакторинга считай нет. Перене...
Дмитрий Петров
9
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Карта сайта