Исключение 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?

429   1  

1 ответ:

Исключения, не обработанные Handle, переупаковываются в новый AggregateException и перестраиваются.

В .NET 4.5 поведение по умолчанию заключается в том, что ненаблюдаемые исключения задачи не снимают процесс.

Чтобы изменить это (и восстановить поведение .NET 4.0), добавьте в конфигурацию приложения следующее:

<configuration> 
    <runtime> 
        <ThrowUnobservedTaskExceptions enabled="true"/> 
    </runtime> 
</configuration>

Смотрите здесь для получения дополнительной информации.

Вам, вероятно, лучше наблюдать исключение, и если никакое изящное завершение не возможно, по крайней мере сообщите об исключении с помощью вашего Регистрация приложений или что-то вроде:

System.Environment.Failfast("Meaningful error message.", exception);

Comments

    Ничего не найдено.