Что может привести к неожиданному завершению процесса / потока .NET? - PullRequest
0 голосов
/ 13 января 2009

Я пытаюсь собрать полный список причин, по которым процесс .NET или поток завершается, хотя метод main () защищен предложением try ... catch.

Одной из таких причин является Thread.Abort () (если только вы не вызываете Thread.ResetAbort). Вы знаете больше причин?

Ответы [ 5 ]

4 голосов
/ 13 января 2009

Исключение StackOverflowException не может быть обработано вашим кодом.

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

Есть и другие исключения, из которых вы не можете восстановиться. ExecutionEngineException представляется одним из них.

1 голос
/ 13 января 2009

В отличие от C / C ++, main () - это не совсем все приложение. Таким образом, даже окружение всего кода в main () блоком try / catch не будет перехватывать все исключения, сгенерированные этим кодом.

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

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

0 голосов
/ 13 января 2009

Выгрузка домена приложения

0 голосов
/ 13 января 2009

Тайм-аут подключения к сети.

Отключение питания.

Пользователь, убивающий данный процесс.

0 голосов
/ 13 января 2009

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

EDIT: Некоторый одновременный доступ при чтении / записи общего поля

...