как отследить, если данный процесс выдает исключение, с помощью сервиса окон в C#

Мой процесс иногда выдает исключение как dllnotfound после того, как запустятся. у меня есть сервис монитора, ответственный за поддержание согласованного состояния процесса.

как я могу отслеживать состояние своего сервиса окон использования процесса.

есть ли реализация с открытым исходным кодом сервиса окон, который поддерживает/отслеживает состояние процесса в окнах.

5
задан Kazoom 3 February 2010 в 00:52
поделиться

6 ответов

Явная привязка подключаемого модуля JAR к фазе, которая не существует.

-121--1158706-

Немного поздно, я знаю, но вот еще одно решение для вашего рассмотрения..

(Из: форма без действий и где ввод не перезагружает страницу )

Добавьте это событие в текстовое поле. Это предотвратит отправку при нажатии Enter, и вы можете добавить кнопку отправки или вызвать form.submit () по мере необходимости:

onKeyPress="if (event.which == 13) return false;"

Например:

<input id="txt" type="text" onKeyPress="if (event.which == 13) return false;"></input>
-121--4379474-

Это невозможно, исключения являются локальными для потока, локальными для вторичного процесса, если он не обработан. Необработанное исключение завершит процесс. Единственная шрапнель, которую вы могли бы получить из такого мертвого процесса, это код выхода процесса. Для которого должно быть установлено значение 0xe0434f4e, код исключения для неуправляемой особой ситуации. Другие релевантные сведения недоступны, если в процессе нет необработанного обработчика исключений, который регистрирует состояние. Это состояние очень ненадежное, процесс перенес крупный сердечный приступ.

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

2
ответ дан 15 December 2019 в 01:01
поделиться

Правка: Итак, на самом деле проблема заключалась не в том, что процесс умирает, а в том, что процесс застрял в диалоге обработчика исключений, ожидая, когда пользователь нажмет на отладку или отмену. Решением проблемы было отключение диалога отладки .net JIT, инструкции здесь http://weblogs.asp.net/fmarguerie/archive/2004/08/27/how-to-turn-off-disable-the-net-jit-debugging-dialog.aspx

Мое первоначальное предлагаемое решение ниже


Не является оконным сервисом, но это довольно простая .NET-программа для написания.

используйте System.Diagnostics.Process, чтобы получить объект Process для процесса, который вы хотите проверить. Вы можете использовать GetProcessByName, если хотите открыть существующий процесс. Если вы создадите процесс из C#, то у вас уже будет объект процесса.

Тогда вы можете просто WaitForExit либо с таймаутом Process, либо без него, либо протестировать свойство HasExited, либо зарегистрировать обратный вызов Exited. После завершения процесса вы можете проверить свойство ExitCode, чтобы узнать, возвращал ли процесс значение ошибки.

2
ответ дан 15 December 2019 в 01:01
поделиться

Вот что я бы подумал, решение, как в нем ведет себя в точности, как яблоко фото app. Я использовал решения, которые использовали:

-(void) scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale

, чтобы вернуться, но мне не понравилось это решение, потому что после масштабирования было сделано, он отскочит, а затем быстро «прыгнуть» в центр, который был очень сексуальный. Оказывается, если вы в значительной степени делаете ту же самую логику, но в этой функции делегата:

-(void)scrollViewDidZoom:(UIScrollView *)pScrollView

она как начинается по центру, так и при уменьшении масштаба остается по центру:

-(void)scrollViewDidZoom:(UIScrollView *)pScrollView {
CGRect innerFrame = imageView.frame;
CGRect scrollerBounds = pScrollView.bounds;

if ( ( innerFrame.size.width < scrollerBounds.size.width ) || ( innerFrame.size.height < scrollerBounds.size.height ) )
{
    CGFloat tempx = imageView.center.x - ( scrollerBounds.size.width / 2 );
    CGFloat tempy = imageView.center.y - ( scrollerBounds.size.height / 2 );
    CGPoint myScrollViewOffset = CGPointMake( tempx, tempy);

    pScrollView.contentOffset = myScrollViewOffset;

}

UIEdgeInsets anEdgeInset = { 0, 0, 0, 0};
if ( scrollerBounds.size.width > innerFrame.size.width )
{
    anEdgeInset.left = (scrollerBounds.size.width - innerFrame.size.width) / 2;
    anEdgeInset.right = -anEdgeInset.left;  // I don't know why this needs to be negative, but that's what works
}
if ( scrollerBounds.size.height > innerFrame.size.height )
{
    anEdgeInset.top = (scrollerBounds.size.height - innerFrame.size.height) / 2;
    anEdgeInset.bottom = -anEdgeInset.top;  // I don't know why this needs to be negative, but that's what works
}
pScrollView.contentInset = anEdgeInset;
}

Где 'imageView' является UIImageView вы используете.

-121--1243832-

В случае с Dll NotFoundException и другими событиями, происходящими при запуске, приложение может указать, когда оно завершит запуск. Например, записать метку времени в файл. Монитор может сравнивать время запуска приложения с временем в файле.

-121--5044529-

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

Если сам процесс является службой Windows, можно проверить его состояние с помощью System.ServiceProcess.ServiceController.

1
ответ дан 15 December 2019 в 01:01
поделиться

Один, которую вы можете сделать, это следить за использованием процессора процесса CPU. Я предполагаю, что ваш процесс уходит, когда исключение брошено. Следовательно, использование процессора процесса должно быть 0, так как он больше не доступен. Следовательно, если использование процессора остается в нуле в течение определенного периода времени, вы можете смело предположить, что процесс поднял исключение. Этот метод не является дураком доказательства, поскольку вы основываете свое решение о использовании ЦП, и законный процесс, может иметь нулевое использование CPU в течение определенного периода времени. Вы можете включить эту проверку внутри вашего мониторинга или вы можете написать простой сценарий VB для проверки использования процессов CPU снаружи.

-1
ответ дан 15 December 2019 в 01:01
поделиться

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

0
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

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