2012-06-04 4 views
1

Я создал приложение Winforms C# для создания потоков и запуска заданий на нашем производственном сервере. Я создал задания в приложении winforms, потому что мне нужен графический интерфейс для настройки и запуска служб.Как запустить службы Windows в приложении winforms?

Недавно мы сменили серверы, и я вышел из системы после определенного количества простоя, и приложение закрыто, поэтому мне нужно сделать службы Windows, чтобы он работал, даже когда я вышел из системы. Проблема в том, что мне нужен графический интерфейс.

Каков наилучший способ создания служб Windows (потому что мне нужно, чтобы они запускались при выходе из системы) с помощью интерфейса GUI?

+1

[Связь между процессами] (http://stackoverflow.com/questions/56121/ipc-mechanisms-in-c -sharp-использование-и-передовой опыт). –

+0

@ ta.speot.is правильно, вам, вероятно, потребуется разделить приложение на часть GUI и часть сервиса, которая должна запускаться без GUI при выходе из системы. Вы можете общаться между этими процессами с помощью межпроцессного взаимодействия. – kenny

+0

Каков наилучший способ сделать это? WCF? Есть ли более легкое решение или стороннее программное обеспечение, чтобы облегчить это быстрее? – Eitan

ответ

0

При создании реального Windows Services

вы можете запускать, останавливать и получить информацию об услуге с помощью the ServiceController class

EDIT

Если вам нужны данные от службы, вы могли бы использовать WCF или Socket для связи с услугой. Другой вариант - опубликовать результаты службы в файле, который находится в хорошо известной папке.

0

Появление службы Windows в сеансе пользователя (= Interactive Windows service) не является хорошей идеей и считается эксплойтом. Я решил эту проблему в своем проекте, разбив приложение в графическом интерфейсе и части сервиса, точно так же, как сказал Кенни. Они взаимодействуют через WCF. Другая возможность - Memory-Mapped files.

0

Если вы хотите простой способ общения между процессами, вы также можете использовать NamedPipeServerStream и NamedPipeClientStream. Эта технология устарела, не очень умна, но проста в использовании (если вы знаете управление потоками на C#) и быстро.

Единственным недостатком является то, что они не говорят об объекте «из коробки». Но для этого я использую XML-сериализацию.

  • На стороне отправителя: Object => XML String => байт []
  • На стороне приемника: байт [] => XML String => Object

Для простоты я всегда используйте объекты String [], которые я анализирую на стороне приемника, как я бы сделал в основной строке (String [] args) приложения

С помощью услуг вы также можете использовать CustomCommands, но это только спросите службу на икру метод, не дающий ему параметров. За исключением случаев, когда вы храните параметры где-нибудь (т. Е. Файл XML), к которым у вашей службы есть доступ к ним

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