Как контролировать длительно работающую программу программно


11

То, что у меня есть, можно суммировать с помощью этого псевдокода:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

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

Это заставило меня задуматься: как в мире я могу изменить свою программу, чтобы я мог запустить другую программу «мониторинга»? Или это должно измениться от того, чтобы быть консольной программой, чтобы сказать программу WPF, которая скрыта?

В целом, я бы предпочел иметь возможность просто запускать на своем компьютере программу, которая проверяет ход выполнения программы по сети, поэтому мне не нужно подключаться к серверу по протоколу RDP, чтобы проверить его состояние (но это не быть концом света).

В целом, я полагаю, что я хотел бы видеть окно, которое говорит что-то вроде: Процесс x из y до сих пор, следующие элементы обрабатываются. Перечислите элементы, например, в таблице, и пусть они скажут как «Загрузка» или «Ожидание ответа». Может быть, если я сойду с ума, я мог бы также определить очередь неисправных предметов (но это было бы просто лишним).

Мой разум продолжает склоняться к событию, но я не могу понять, как мне запустить программу, которая может подписаться и отписаться от работающей программы. Это вообще возможно?


Вы хотите отслеживать ход выполнения операций загрузки / ответа (продолжительностью 10 минут) или хотите узнать, сколько загрузок было выполнено внутри цикла "Parallel.ForEach"?
Док Браун

@DocBrown см. Редактировать. (два последних абзаца)
Роберт Снайдер,

1
Похоже, что вам нужна простая программа-приемник UDP. Вы можете отбросить пакеты статуса в сети, и если там нечего их принимать, никакого вреда не будет.
Роберт Харви

Ответы:


7

Что вам нужно, это способ связи между вашими программами, который не связывает их друг с другом. Есть несколько способов сделать это, вы можете сделать так, чтобы задача записывалась в файл, и вам приходилось следить за чтением из файла, делать задачу доступной через WCF, чтобы монитор мог «опросить» изменения, использовать сеть ...

Чтобы не изобретать колесо, взгляните на цели ведения журнала log4net. Если бы я реализовал что-то подобное, я бы, вероятно, использовал log4net и входил бы в протокол UDP или Telnet и подключил бы монитор на другом конце. log4net позаботится обо всем за вас, включая исключение исключений, когда монитор не активен.


Я думаю, что я собираюсь пойти с этим ответом, потому что мы уже используем log4net для хорошо .. регистрации :) Так что это хорошо бы соответствовало тому, что у него есть. Я понятия не имел, log4net мог сделать это! Спасибо
Роберт Снайдер

9

Из ваших комментариев я вижу, что у вас есть доступная клиент-серверная база данных, и у вашего загрузчика уже есть подключение и доступ для записи? Тогда, вероятно, было бы проще всего добавить в базу данных таблицу «мониторинга» или «состояния» и позволить вашему загрузчику сообщать о своем прогрессе там (регистрируйте каждый «интересный» шаг там, вероятно, 5 шагов, которые вы перечислили выше).

Для просмотра состояния создайте вторую программу с графическим интерфейсом, которая подключается к базе данных и отображает состояние (например, опрашивая с интервалом в 1 минуту). Вы можете запустить эту программу на локальном рабочем столе, при условии, что оттуда можно подключиться к базе данных.

Конечно, когда запись в таблицу состояния влияет на транзакции вашей базы данных, вы можете использовать отдельное соединение. Вы также можете использовать механизм очереди сообщений, такой как MSQM , но это может быть слишком большим решением для вашего простого случая.


+1 Это лучший способ сохранить простоту и не усложнять то, что не должно быть слишком сложным.
Томас Стрингер

3

Просто для того, чтобы использовать ответ @ JDT, наиболее распространенный способ сделать это - записать сообщения в очередь сообщений. Когда в вашем приложении происходит что-то важное, оно пишет сообщение и отправляет его в очередь сообщений. Обычно формат сообщения - XML ​​или аналогичный. Это автор очереди.

Приложение мониторинга считывает (читатель очереди) очередь, выбирает сообщения и обрабатывает их, сохраняя их и анализируя сообщения в сравнении с предыдущими сообщениями или условиями. Если условие выполнено, приложение мониторинга выдаст предупреждение, указывающее на потенциальную проблему.

Это отделяет ваше приложение от самого мониторинга, поскольку оно просто отправляет сообщения. Приложение мониторинга должно определить, основываясь на текущих сообщениях, что произошло что-то хорошее или плохое. Очереди используются потому, что они предлагают хорошие средства для хранения сообщений без потерь.

Вы хотите централизовать обмен сообщениями, если запущено несколько экземпляров приложения. Если существует только 1 экземпляр, тогда может быть достаточно использования других хранилищ, таких как журнал событий Windows или файл.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.