Код, который опрашивает устройство, логически является частью вашей службы WCF, а не хост-проекта.Независимо от того, находится ли код физически в проекте службы WCF или в библиотеке классов, на которую ссылается проект службы WCF, это личное предпочтение.
Вот как я это сделал.
У меня есть WCF CollectionService, которыйразмещен в службе Windows.Проект CollectionService, очевидно, имеет класс CollectionService
, который реализует интерфейс ICollectionService
с включенным WCF, то есть как клиенты взаимодействуют с CollectionService.
В этом же проекте у меня есть класс Collector
, который имеетзакрытый конструктор, предотвращающий создание экземпляров класса вне области действия класса.Класс имеет собственный статический список Collectors
, который он поддерживает.Класс также имеет две статические функции - Start()
и Stop()
.
Когда клиент хочет запустить Collector
, он вызывает операцию Start()
службы CollectionService.Этот CollectionService, в свою очередь, вызывает статическую функцию Collector.Start()
, которая создает экземпляр Collector
и сохраняет его в статическом списке Collectors
.Когда клиент желает остановить Collector
, он вызывает операцию Stop()
службы CollectionService, которая преобразуется в вызов статической функции Collector.Stop()
, останавливает Collector
и удаляет его из списка.
Когда создается экземпляр Collector
, он запускает новый поток, который начинает сбор данных и делает их доступными для заинтересованных сторон. Новый поток - это ключ. В противном случае экземпляр Collector
просто будет сидеть в списке Collectors
и ничего не делать.
Поскольку я имею дело с потоками, очевидно,Мне приходится иметь дело с вопросами синхронизации, такими как синхронизация доступа к статическому списку Collectors
.Я не хочу, чтобы клиент пытался запустить Collector
, в то время как кто-то другой пытается его выключить.
Вот и все в двух словах.
Если вы не создали службу WindowsТем не менее, вот две SO-поста, которые я написал и которые содержат пошаговые инструкции о том, как это сделать.
Первая ссылка в основном возвращает вас к службе;второй показывает, как установить / удалить его, не требуя InstallUtil
.
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ
Если только один Controller
может быть запущен, тогда последующие вызовы для запуска Controller
могут быть просто проигнорированы, возможно, с ответным сообщением, указывающим, что он уже запущен.
Если вы хотите, чтобы несколько клиентов получили доступ к данным из Controller
это довольно просто.Вам просто нужно вести список подписчиков.Controller
просто отправляет данные любым подписчикам в списке.
Такая структура публикации-подписки в WCF уже существует.Вы можете прочитать подробности здесь:
Что нужно знать об односторонних вызовах, обратных вызовах и событиях
Вы можете бесплатно загрузить этот фреймворк от Juval Lowy'sвеб-сайт, IDesign.net .Я использую эту концепцию, чтобы сигнализировать о событиях CollectionService заинтересованным сторонам.Я ожидаю, что вы можете использовать одну и ту же концепцию для предоставления данных нескольким клиентам.