Исключение Task OutOfMemory не завершает процесс
У меня есть следующий код задачи с удачным и на сбойных продолжениях.
Task<IEnumerable<IDictionaryObject>> getParameters = _parametersRequester.BeginGetParametersBulk(requestJob);
var processParameters =
getParameters.ContinueWith((x) =>
{
//Do some processing
}, TaskContinuationOptions.OnlyOnRanToCompletion);
getParameters.ContinueWith((x) =>
{
AggregateException ex = x.Exception;
ex.Flatten().Handle(ie => HandleException(requestJob, canRetry, ie));
}, TaskContinuationOptions.OnlyOnFaulted);
return processParameters;
HandleException повторяет некоторые операции, если возникшее исключение известно, и возвращает false, если оно попадает в неизвестное исключение.
Проблема, которую я вижу, заключается в том, что getParameters выбрасывает исключение OutOfMemoryException, которое должно завершать процесс при запуске GC-финализаторов, но они, похоже, не работают, поэтому процесс все еще работает и находится в нестабильном состоянии.
Существует ли какой-либо способ заставить процесс завершить, если HandleException возвращает false?
1 ответ:
Исключения, не обработанные
Handle
, переупаковываются в новыйAggregateException
и перестраиваются.В .NET 4.5 поведение по умолчанию заключается в том, что ненаблюдаемые исключения задачи не снимают процесс.
Чтобы изменить это (и восстановить поведение .NET 4.0), добавьте в конфигурацию приложения следующее:
<configuration> <runtime> <ThrowUnobservedTaskExceptions enabled="true"/> </runtime> </configuration>
Смотрите здесь для получения дополнительной информации.
Вам, вероятно, лучше наблюдать исключение, и если никакое изящное завершение не возможно, по крайней мере сообщите об исключении с помощью вашего Регистрация приложений или что-то вроде:
System.Environment.Failfast("Meaningful error message.", exception);
Comments