C # программа для Windows - PullRequest
       13

C # программа для Windows

3 голосов
/ 17 марта 2012

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

public partial class MyNewService : ServiceBase
{
    public MyNewService()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";
    }




    static void Main()
    {
        System.ServiceProcess.ServiceBase[] ServicesToRun;
        // Change the following line to match.
        ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };
        System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
}

}

Ответы [ 7 ]

3 голосов
/ 17 марта 2012

Вам необходимо переопределить метод OnStart (и другие подобные, такие как OnStop, OnShutdown и т. Д.).

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

1 голос
/ 17 марта 2012

В этом прохождении говорится, что вы переопределяете OnStart().

Если вы не привязаны к использованию этого шаблона программы службы Windows, вы можете проверить эту библиотеку , которая значительно упрощает услуги программирования. Прямо сейчас исполняемый файл службы не может быть запущен напрямую - он может быть только установлен. Библиотека Hoytsoft устанавливает и затем автоматически запускает ее для вас, как обычное приложение Windows Form.

0 голосов
/ 16 мая 2012

Переопределите метод OnStart (), чтобы вызвать вашу бизнес-логику.Как упоминалось ранее, вы можете либо создать другой поток, чтобы иметь функциональность, либо использовать Eventhandlers с таймерами (снова используя многопоточность), чтобы вызвать логику busineess.Служба должна вернуть управление ОС, и, следовательно, метод Onstart должен вернуть управление в окна во время работы службы.

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

0 голосов
/ 17 марта 2012

Как уже было сказано, не помещайте свой код в OnStart (). Зачем? Потому что, если ваш метод OnStart () не возвращается быстро, менеджер сервиса помечает ваш сервис как не отвечающий и отключит вас.

Итак, я помещаю свой код в метод Start (), и все, что OnStart () делает, это вызывает Start (). Вот так:

    protected override void OnStart(string[] args)
    {
        Start();
    }

    public static void Start()
    {
       ... do stuff
    }

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

System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);

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

        if(Debugger.IsAttached)
            Service.Start();
        else
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service() 
            };

            ServiceBase.Run(ServicesToRun);
        }
0 голосов
/ 17 марта 2012

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

0 голосов
/ 17 марта 2012

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

В частности, в простейшем случае:

protected override void OnStart(string[] args)
{
    //Do stuff here
}
0 голосов
/ 17 марта 2012

Переопределите следующие методы на вашем MyNewService при необходимости:

protected virtual void OnContinue();
protected virtual void OnCustomCommand(int command);
protected virtual void OnPause();
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus);
protected virtual void OnSessionChange(SessionChangeDescription changeDescription);
protected virtual void OnShutdown();
protected virtual void OnStart(string[] args);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...