События с параллельной библиотекой задач

#.net #events #task-parallel-library

#.net #Мероприятия #task-parallel-library

Вопрос:

Я использую параллельную библиотеку задач .NET 4.0 для выполнения длительной задачи. Длительная задача состоит из разных этапов, и на каждом этапе она завершается, я хочу записать некоторую информацию в текстовый файл или базу данных. Вместо вызова методов журнала на каждом этапе я подумал об использовании шаблона publisher / subscriber, т.е. На каждом этапе какое-то событие должно запускаться из длительно выполняемой задачи, а какой-то другой класс должен прослушивать эти события и регистрировать соответствующую информацию из объекта event.

Я не очень разбираюсь в использовании событий в многопоточной среде. Хорошая ли идея использовать события в TPL и как я могу это сделать? ищу несколько предложений..

Ответ №1:

То, что вы описываете, — это именно то, что представляет собой шаблон «Асинхронный на основе событий«. Который также реализуется различными классами в BCL. Пример: класс WebClient имеет метод DownloadStringAsync, который запускает загрузку в другом потоке (используя TPL или что-то еще), и этот класс предоставляет DownloadStringCompleted и DownloadProgressChanged (что точно соответствует шагам, выполняемым в вашей длительной задаче).

Итак, в принципе, это нормально для реализации этого шаблона. Дело в том, чтобы помнить, что эти события будут возникать в потоке, в котором выполнялась задача, поэтому вам нужно убедиться, что обработчики этих событий знают об этом факте.

Комментарии:

1. Спасибо за ваш ответ. Обработчик событий будет выполняться в потоке, в котором запущено событие rgt?

2. @Mark : Да, правильно. События похожи на список делегатов, поэтому, когда вы запускаете событие, в основном каждый делегат в списке выполняется один за другим.