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

79 просмотров

Звучит как 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
А как это должно будет работать? На словах примерн...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно 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
Карта сайта