Приложение C# неожиданно завершается

Возможно, необразованная предсказуемая реакция, но идея сохранить репозиторий в двоичном блобе как база данных SQLite пугает меня. Я также сомнителен из преимуществ включения wikis и средств отслеживания ошибки непосредственно в VCS - или они под-известным по сравнению с полным программным обеспечением как Trac, или VCS в широком масштабе чрезмерно увеличен в размере по сравнению с Подверсией или Базаром.

11
задан CodesInChaos 22 November 2013 в 10:18
поделиться

8 ответов

Какой идентификатор вы используете для запуска консольного приложения?

Кроме того, вы можете захотеть использовать SetConsoleCtrlHandler для захвата событий консоли. См. это сообщение в блоге для получения дополнительных сведений. У нас была аналогичная проблема, когда консольное приложение запускалось под учетной записью службы, и время от времени оно могло завершаться. Я не уверен, что вы столкнулись с этим. Дайте мне знать, я могу опубликовать код.

ОБНОВЛЕНИЕ: похоже, ваш сценарий похож на то, что мы испытали. В обработчике событий консоли вам необходимо проверить событие LogOff и вернуть значение true. Посмотрите эту статью в KB .

public static void inputHandler(ConsoleCtrl.ConsoleEvent consoleEvent)
{
   if (ConsoleEvent == ConsoleCtrl.ConsoleEvent.CtrlLogOff)
       return true;
   return false;
}
9
ответ дан 3 December 2019 в 02:02
поделиться

Вам необходимо иметь аналогичный блок catch на верхнем уровне функции, с которой работает каждый поток. Если в потоке есть неперехваченное исключение, оно убьет приложение, а блок catch в основном потоке не поможет.

9
ответ дан 3 December 2019 в 02:02
поделиться

Это может быть функция Logging.Log, которая вызывает ваше исключение.

3
ответ дан 3 December 2019 в 02:02
поделиться

Это может быть память утечка. Если ваше приложение занимает слишком много памяти, Windows убьет его. Вы можете проверить, сколько памяти вы используете: если он со временем увеличивается, у вас может быть утечка памяти.

Другая возможность состоит в том, что где-то у вас есть код, вызывающий Environment.Exit (). Попробуйте выполнить полнотекстовый поиск по вашему коду, чтобы проверить еще раз. Мало ли!

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

Будьте осторожны; есть некоторые исключения, которые невозможно перехватить: OutOfMemoryException и StackOverflowException.

Поэтому ваша программа умрет ужасно, но тихо.

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

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

То, что это работало раньше, означает, что либо в DoWork () было что-то, что ожидало тех потоков, которые теперь сразу же возвращаются (не работают), либо эта часть все еще работает, но поток, для которого раньше требовалось много времени, теперь прерывается и возвращается сразу.

3
ответ дан 3 December 2019 в 02:02
поделиться

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

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Мой опыт работы с приложением Win32 C ++, а не C #.

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

Возможно, что один из потоков, порождаемых методом DoWork, генерирует исключение. По умолчанию в этом случае процесс завершается. Вы можете предотвратить это, используя событие AppDomain.UnhandledException , чтобы переопределить поведение по умолчанию.

5
ответ дан 3 December 2019 в 02:02
поделиться