C # Windows Service - служба на локальном компьютере запускается, а затем останавливается? - PullRequest
0 голосов
/ 18 августа 2011

Я пытаюсь создать свою первую службу Windows, но мне так грустно ... после того, как я запустил службу вручную из services.msc, сообщение «служба на локальном компьютере запустилась, а затем остановилась.некоторые службы автоматически останавливаются, если у них нет работы '

Я уверен, что в моем коде должна быть какая-то ошибка ...

namespace ConvertService
{
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        this.ServiceName = "ConvertService";
        this.EventLog.Log = "Application";
    }
    static void main()
    {

        ServiceBase.Run(new Service1());
    }


    protected override void OnStart(string[] args)
    {
        Process pMP3 = new Process();
        pMP3.StartInfo.UseShellExecute = false;
        pMP3.StartInfo.RedirectStandardOutput = true;
        pMP3.StartInfo.FileName = @"d:\...path...\converter.exe";
        pMP3.StartInfo.Arguments = @"d:\...path...\tempamr.amr " + @"d:\...path...\tempmp3.mp3 " + @"-cmp3";
        pMP3.Start();
        pMP3.WaitForExit();
        Process pWAV = new Process();
        pWAV.StartInfo.UseShellExecute = false;
        pWAV.StartInfo.RedirectStandardOutput = true;
        pWAV.StartInfo.FileName = @"d:\...path...\converter.exe";
        pWAV.StartInfo.Arguments = @"d:\...path...\tempmp3.mp3 " + @"d:\...path...\tempwav.wav " + @"-cwav";
        pWAV.Start();
        pWAV.WaitForExit();

    }

    protected override void OnStop()
    {
    }
}

}

Простите меняесли бы я сделал глупые ошибки.Это моя самая первая служба Windows.

PS.Я уже отмечал «Разрешить сервису взаимодействовать с рабочим столом»

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

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

protected CancellationTokenSource _tokenSource = null;
protected Task _thread = null;

protected override void OnStart(string[] args)
{
    _tokenSource = new CancellationTokenSource();
    _thread = Task.Factory.StartNew(() => DoMyServiceLogic(), TaskCreationOptions.LongRunning, _tokenSource);
}

protected override void OnStop()
{
     _tokenSource.Cancel();
}

protected void DoMyServiceLogic()
{
     while(!_tokenSource.Token.IsCancellationRequested)
     {
         // Do Stuff
     }
}

Ваш сервис на самом деле не следует шаблону;Вы не делаете вещи непрерывно, и это должно быть больше консольной программой.

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

0 голосов
/ 18 августа 2011

Открыть событие vwr.msc. Там вы увидите подробности исключений о том, почему ваша служба Windows перестала работать. Кстати, вы должны как можно быстрее выйти из метода OnStart, потому что вы только есть 30 секунд, чтобы закончить метод OnStart. На MSDN есть отличная статья, описывающая "как отлаживать" службы Windows.

0 голосов
/ 18 августа 2011

Убедитесь, что учетная запись, под которой работает ваша служба, может получать доступ к этим файлам (включая права на запись для файлов .wav и .mp3).

Ваш код также может вызывать необработанное исключение. Я не уверен, но это может быть видно в журнале событий. Вы также можете заставить свою службу явно записывать сообщения в журнал событий (как в случае исключения); проверить эту ссылку: http://www.codeproject.com/KB/dotnet/simplewindowsservice.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...