Проблемы с службой Windows, блокировкой коллекции и многопоточностью - PullRequest
3 голосов
/ 14 октября 2011

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

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

Проблема I 'Имеется следующее:

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

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

1 Ответ

4 голосов
/ 14 октября 2011

Вы можете обрабатывать исключения в задаче, используя метод `.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.
...