Во-первых, вам действительно следует стараться не создавать исключений - и не обрабатывать - в фоновом потоке. Если вы управляете тем, как выполняется ваш делегат, инкапсулируйте его в блок try catch и найдите способ передать информацию об исключении обратно в ваш основной поток (используя EndInvoke, если вы явно вызвали BeginInvoke, или где-то обновив некоторое общее состояние).
Игнорирование необработанного исключения может быть опасным. Если у вас есть настоящее необрабатываемое исключение (на ум приходит OutOfMemoryException), вы все равно мало что можете сделать, и ваш процесс в основном обречен.
Возвращаясь к .Net 1.1, необработанное исключение в фоновом потоке просто было бы выброшено в никуда, и основной поток с удовольствием начал бы пахать. И это может иметь неприятные последствия. Так что в .Net 2.0 это поведение изменилось.
Теперь необработанное исключение, созданное в потоке, который не является основным, прервет процесс. Вы можете быть уведомлены об этом (подписавшись на событие в AppDomain), но процесс все равно прекратится.
Поскольку это может быть неудобно (если вы не знаете, что будет выполняться в потоке, и не совсем уверены, что он должным образом защищен, а ваш основной поток должен быть устойчивым), существует обходной путь. Он задуман как устаревшие настройки (то есть настоятельно рекомендуется убедиться, что у вас нет случайных потоков), но вы можете принудительно настроить прежнее поведение следующим образом:
Просто добавьте этот параметр в ваш сервис / приложение / любой другой файл конфигурации:
<configuration>
<runtime>
<!-- the following setting prevents the host from closing when an unhandled exception is thrown -->
<legacyUnhandledExceptionPolicy enabled="1" />
</runtime>
</configuration>
Похоже, он не работает с ASP.NET.
Дополнительную информацию (и огромное предупреждение о том, что этот параметр может не поддерживаться в следующих версиях CLR) см. http://msdn.microsoft.com/en-us/library/ms228965.aspx