2009-11-21 2 views
0

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

Я хочу, чтобы меня процесс спать pacefull (не в бесконечном цикле нюхает что-то) до моего приложения WinForms сказать ему: «Эй, делать вещи, и позвони мне, когда работа сделана»

кто-то может дать мне смотровая точка?

Спасибо.

ответ

3

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

0

Если служба Windows находится на одной машине, вы можете остановить и запустить сервис? или вызвать веб-сервис, который останавливает/запускает службу на другой машине?

Если у вас есть служба, которая опросит (или «понюхает») что-то делать, это может быть очень маленький и основной вызов базы данных, чтобы проверить что-то, что вызовет фактическую работу?

+0

Если я остановка и запуск службы, как моя программа может знать, когда работа выполнена, и если возникла ошибка? Я хочу избежать опросов. Конечно, я могу сделать это таким образом, а затем написать результаты в таблице, но я думаю, что было бы лучше и элегантно как бы прямое общение. Что-то вроде событий, поднятых одной стороной и зацепивших другую сторону. – Jonathan

+0

Вы можете просто начать запуск службы. Затем Служба могла бы остановиться, когда закончите? –

3

Необходимо использовать межпроцессную связь (IPC). Для C# это обычно означает, что .NET remoting - на старых версиях .NET - или Windows Communication Foundation (WCF) - на новых версиях .NET.

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

Если это слишком сложно, вы можете использовать именованный объект события, который служба ожидает, и клиент устанавливает.

1

Начальная точка:

Self-хостинг WCF службы

1

Любой из механизмов IPC квалифицироваться, чтобы это сделать. Если вам нужна простая, просто передача сообщений, рассмотрите либо именованный канал (NamedPipeServerStream), либо сокет. Если они сложны, подумайте о Remoting по каналу IPC или WCF.

Лично мне нравятся именованные каналы для этого. Просто убедитесь, что имя канала имеет префикс «Global», поэтому оно видно из сеанса интерактивного рабочего стола. Шифруйте сообщения, если проблема безопасности. Выделите фоновый поток в своей службе, который блокирует вызов в потоке канала для реализации обработки сообщений.

Смежные вопросы