2015-04-14 5 views
1

Я написал консольное приложение, которое в настоящее время выполняется на сервере. Он не требует ввода пользователем (кроме параметров при запуске, которые могут быть выполнены с помощью параметра запуска).Консольное приложение «Всегда работает»

К сожалению, это решение плохо, потому что кто-то может его отключить (т. Е. При подключении к серверу с использованием подключения к удаленному рабочему столу, а затем просто отключение отключение). Мне нужно, чтобы он работал все время.

Одним из решений было бы превратить его в службу Windows, но до сих пор использование SC или сторонних инструментов, таких как nssm или RunAsService, не удалось (SC и Nssm создают службу, но такую ​​услугу не удается запустить).

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

Наконец-то я мог оставить его в качестве консольного приложения и использовать планировщик задач для его запуска, который выглядит как приличное решение, но (как я уже упоминал) мне нужно, чтобы он работал все время (его можно поворачивать off и on - очень короткие простои не являются проблемой).

Могу ли я запросить любую помощь при настройке такой задачи?

решаемые

После нескольких попыток я превратил его в службу, используя Topshelf и this great guide.

+3

Что вы прочитали, что предположили, что использование сервиса - плохая идея? Это идеальное решение для вас. Сервисы могут перезапускаться при сбое, что очень полезно. – arjabbar

+1

Возможно, вам захочется взглянуть на отличную библиотеку с открытым исходным кодом TopShelf для размещения вашей сборки в качестве сервиса. Это довольно просто для создания службы, которая может сама установить и удалить, включая параметры для учетной записи для запуска и т. Д. – Alex

+0

Да, напишите ее как услугу. Вы пытаетесь изобрести колесо здесь, когда нет необходимости. –

ответ

2

Есть два способа, которые можно использовать для запуска программы .net постоянно в окнах. Оба имеют свои преимущества и недостатки.

службы Windows

  • Рекомендуемое решение
  • Будет ли запуск службы на старте компьютера (не требует кого-то, чтобы войти в систему)
  • имеет некоторое (ограниченное) обработку ошибок в форме перезагрузки
  • Хорошо подходит для очень надежных служб, которые могут работать в течение длительного времени
  • Service обрабатывает его собственное состояние
  • Можно легко работать из-за утечки памяти

приложений IIS сервера

  • Не рекомендуемые решения
  • начинается с окнами, но не может начать свой приложение
  • Требуется более новые окна, позволяющие всегда в конфигурации
  • Всегда на конфигурации сложная
  • государства обрабатывается IIS
  • Намного лучше упругости дрянного программирования, поскольку IIS будет перезагружен для вас
  • IIS будут также, вероятно, убить ваши темы для вас (так что ваш планировщик перестанет работать)

Я подозреваю, что вам сказали, что услуга Windows не рекомендуется, из-за того, что она может произойти сбой из-за утечек памяти. Но эта проблема будет возникать независимо от того, что, поскольку ваша программа должна работать в течение длительного времени (это не проблема с службами Windows, но с долговременными процессами).

0

Есть ряд правил, которые необходимо следовать, чтобы написать функциональное обслуживание окон, включая, но не ограничиваясь

  • возможность завершить процесс инициализации в определенное время
  • общее понимание нити

Нет ничего плохого в написании службы Windows, для чего требуется простое усилие и установщик.

На основании вашего описания запланированное задание, кажется, соответствует вашим требованиям

0

Если вы не хотите, чтобы повторно написать консольное приложение в сервис окон и хотите, чтобы работать все время, единственное решение Я мог видеть это:

  • Создать службу маленького окна, который проверяет, чтобы увидеть, если ваш консольного процесса работает или нет.

  • Если он обнаружил, что нет процесса консоли, тогда запустите новый.

    Process[] pname = Process.GetProcessesByName("YourConsoleApp.exe"); 
    if (pname.Length == 0) 
        Process.Start("YourConsole.exe") 
    else 
        //Do nothing 
    
+0

Я бы настоятельно рекомендовал против разработки решения Rube Goldberg, когда есть совершенно хороший, простой способ решения одной и той же проблемы. –

+0

@ DanielMann Да, это может быть «плохим» решением. Тем не менее, вам всегда нужно написать анти-шаблон, прежде чем придумать правильный шаблон дизайна для себя. И иногда, возможно, придется адаптироваться к решению «не так хорошо», чтобы избежать осложнения слишком хорошего конструкторского решения, которое не требовалось в первую очередь. – ANewGuyInTown

+0

Первоначально это была моя идея, так как я действительно не хотел слишком много ругать с кодом, но на самом деле это не очень хорошее решение. Таким образом, я +1 для того, чтобы думать так же, как и я: P – Yasskier