Преимущества консольного приложения над окнами

У меня есть .Net консольное приложение, которое с помощью запланированного события запустится, вызовите метод сервиса mweb и закройте. Это работает каждый час/каждый день. Хотя нет ничего "неправильного" в реализации, мне было интересно, есть ли какая-то польза для реализации этого как службы Windows.

Есть ли у кого-нибудь какие-либо взгляды на то, что было бы лучшим в этом случае?

Ответы

Ответ 1

Я обнаружил, что службы Windows трудно отлаживать, поэтому я стараюсь использовать их только тогда, когда:

(A) То, что я делаю, довольно сложно или

(B) должно выполняться все время (пример: мониторинг чего-либо для изменений)

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

Ответ 2

Служба отличается от приложения тремя способами:

  • Он запускается без входа пользователя в систему
  • У него не может быть никакого пользовательского интерфейса (консоль также является интерфейсом)
  • Он может работать под повышенными правами (учетная запись SYSTEM) и, таким образом, выполнять действия, которые не разрешены для пользователей.

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

Я исхожу из вашего вопроса, что вам нужно фоновое приложение без какого-либо пользовательского интерфейса (пункт 2 выше). Кажется, вам не нужны элементы 1 или 3. Вы можете получить чистое фоновое приложение без какого-либо окна (консоли или еще), не создавая его. Просто создайте простое приложение Windows и измените

static class Program
{       
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

к

static class Program
{       
    [STAThread]
    static void Main()
    {
        // Application.EnableVisualStyles();
        // Application.SetCompatibleTextRenderingDefault(false);
        // Application.Run(new Form1());

        DoWhateverYouWant();
    }
}

О да, и Крис полностью прав насчет отладочных услуг, которые являются настоящей болью!

Ответ 3

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

Вы делаете мир лучше.

: -)

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

Чтобы уточнить: продолжайте, вы делаете это правильно.

Ответ 4

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

Я согласен, что отладка служб Windows SUCKS! Это ужасно, и MS действительно должна решать возможность отладки службы.

Однако... есть некоторые бесплатные инструменты, которые значительно облегчают процесс. У Anderson Imes есть хорошая утилита, которая позволяет записывать службы Windows так же, как писать консольное приложение даже во время цикла отладки.

Проверьте его утилиты для отладки служб в http://theimes.com/files/

Наилучшая часть его реализации заключается в том, что это 1-строчное изменение в вашем коде, что вы можете легко управлять с помощью параметра #if DEBUG, если вы не хотите, чтобы его библиотека была в вашем экземпляре.

Ответ 5

Существует простейшее решение для отладки служб. Вы создаете комбинированное консольное/сервисное приложение.

Вы проверяете какой-либо аргумент командной строки (например, -debug), а затем выполняете свой код OnStart, ждите нажатия клавиши, выполняйте код OnStop.

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

Ответ 6

Важно помнить, что в консольных приложениях поддерживается пространство имен System.Drawing, что означает, что вы можете печатать. Это работает в Windows Services, но не поддерживается и не является полностью стабильным.

Ответ 7

Нельзя отрицать две точки из Криго и 3 точки от treb. Но я обнаружил, что SQL Server Agent 05/08/R2 является очень надежным и полезным планировщиком задач. Он более надежный, чем расписание задач Windows, и вы не должны беспокоиться о правах пакета или о регистрации пользователя.

У меня есть фоновая системная программа, которая выполняется каждые 2 минуты через агента SQL Server. Я решительно решил преобразовать его в службу Windows, но я не могу это оправдать.

Хотя в другой ситуации весы можно было легко опрокинуть.

Ответ 8

Это не ваш вопрос, но я обычно делаю комбинацию из двух подходов.

Я использую консоль для целей отладки и службу Windows, которая имеет одну и ту же библиотеку и правила.