Служба Windows не запускается при использовании процесса для выполнения исполняемого файла через c # .net - PullRequest
0 голосов
/ 23 ноября 2010

Я использую службу Windows для выполнения ffmpeg.exe для преобразования видеофайлов.Я делаю это, запуская процесс в c # .net .Проблема в том, что

Мой код в OnStart () службы Windows выглядит следующим образом:

FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}", InputFile, OutputFile);

Process proc;
proc = new Process();

try
{
    proc.StartInfo.FileName = spath + "\\ffmpeg\\ffmpeg.exe";
    proc.StartInfo.Arguments = FilArgs;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.CreateNoWindow = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;

    eventLog1.WriteEntry("Going to start process of convertion");

    proc.Start();

    string StdOutVideo = proc.StandardOutput.ReadToEnd();
    string StdErrVideo = proc.StandardError.ReadToEnd();

    eventLog1.WriteEntry("Convertion Successful");
    eventLog1.WriteEntry(StdErrVideo);               

}
catch (Exception ex)
{
    eventLog1.WriteEntry("Convertion Failed");
    eventLog1.WriteEntry(ex.ToString());            
}
finally
{
    proc.WaitForExit();
    proc.Close();
}

, когда я пытался конвертировать большие видеофайлы (я испытал это, когда размер файла был> 14 МБ), как упоминалось выше, служба не запускается и находится в состоянии «запуск».

Функция ffmpeg при непосредственном запуске из командной строки также отлично работает для больших файлов.

Любойподскажите пожалуйста как это решить ...

1 Ответ

5 голосов
/ 23 ноября 2010

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

Windows ждет, пока OnStart () вернется в течение тайм-аута, и если этого не произойдет, уничтожит его.

По сути, вы начинаете там тему:

private Thread _workerThread;
private bool _closing = false;
... OnStart(...)
{
     _workerThread = new Thread(new ThreadStart(Work));
     _workerThread .Start();

}

private void Work()
{
    while(!_closing)
    {
    // do the processing if there is work otherwise sleep for say 10 seconds 
    }
}


... OnStop(...)
{
    _closing = true;
    _workerThread.Abort()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...