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

Проблемы со службой Windows, сбором блокировок и многопоточностью

Мой сценарий:

  • Служба Windows .NET 4
  • Я опрашиваю базу данных на наличие сущностей.
  • Когда появляются новые объекты, они добавляются в файл BlockingCollection.
  • В сервисе OnStart я создаю System.Threading.Tasks.Task, задачей которого является перечисление BlockingCollection (используя GetConsumingEnumerable()).

Проблема у меня вот в чем:

  • Когда в задаче возникает необработанное исключение, я хочу, чтобы это исключение регистрировалось, а служба останавливалась.
  • Я не могу поймать исключения из задачи, пока не вызову Task.Wait().
  • Если я вызову Task.Wait(), метод OnStart заблокируется, и служба никогда не завершит запуск.

Итак, как я могу заставить это работать?


  • Разве вы не можете перехватить все исключения в теле задачи и обработать их надлежащим образом? 14.10.2011
  • Невозможно справиться с чем-то, чего не ожидаешь. 14.10.2011

Ответы:


1

Вы можете обрабатывать исключения в задаче с помощью метода `.ContinueWith':

Task.Factory.StartNew(() => {

    // Do some long action
    Thread.SpinWait(5000000);

    // that eventually has an error :-(
    throw new Exception("Something really bad happened in the task.");

    // I'm not sure how much `TaskCreationOptions.LongRunning` helps, but it sounds 
    // like it makes sense to use it in your situation.
}, TaskCreationOptions.LongRunning).ContinueWith(task => {

    var exception = task.Exception;

    /* Log the exception */

}, TaskContinuationOptions.OnlyOnFaulted); // Only run the continuation if there was an error in the original task.
14.10.2011
  • Спасибо! Это то, что я искал. 14.10.2011
  • Примечание для новичков, пробующих приведенный выше пример кода в прототипе приложения: создайте задачу, используя переменную: `Task myTask = ‹код, как указано выше›; myTask.Wait();` myTask.Wait() заставит основной поток ожидать созданную задачу, чтобы вы могли увидеть вышеописанное в действии. 01.04.2012
  • Новые материалы

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

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

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

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

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

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

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