Nano Hash - криптовалюты, майнинг, программирование

Исключение 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 поведение по умолчанию заключается в том, что незамеченные исключения Task не прерывают процесс.

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

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

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

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

System.Environment.Failfast("Meaningful error message.", exception);
30.12.2013
  • Спасибо за ответ, Джеймс. Это 4.0, хотя странно, почему он не останавливает процесс. Я читал что-то о том, что GC запустил финализатор для этой задачи до того, как это произойдет, чего в моем случае также не происходит. 30.12.2013
  • У вас установлен .NET 4.5? Если это так, это все, что вам нужно, чтобы применить это... (Это обновление на месте, которое также влияет на приложения, скомпилированные для .NET 4.0... Я знаю! Отстой, верно?) 30.12.2013
  • Нет, 4.5 на этой коробке не установлено. 30.12.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..