使用进程通过c#.net执行exe文件时,windows服务无法启动

使用进程通过c#.net执行exe文件时,windows服务无法启动,c#,windows-services,C#,Windows Services,我正在使用windows服务执行ffmpeg.exe以转换视频文件。我通过启动c#.net中的进程来实现这一点。问题是 我在windows服务的OnStart()中的代码如下: FilArgs = string.Format("-i {0} -ar 22050 -qscale 1 {1}", InputFile, OutputFile); Process proc; proc = new Process(); try { proc.StartInfo.FileName = spath

我正在使用windows服务执行
ffmpeg.exe
以转换视频文件。我通过启动c#.net中的进程来实现这一点。问题是

我在windows服务的OnStart()中的代码如下:

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();
}
如上所述,当我尝试转换大型视频文件时(当文件大小>14MB时,我遇到了这种情况),服务无法启动,并且处于“启动”状态

ffmpeg在直接通过命令提示符运行时,也适用于较大的文件


任何人请告诉我如何解决这个问题…

这很糟糕,因为
onstart()
应该只为worker循环启动一个后台线程
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()
}

这是不好的,因为
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()
}

谢谢你的答复。。但我仍然遇到了耗时的文件操作问题。在您提到的通过线程执行函数之后,现在服务正常启动。但问题是我的功能没有完成。当我检查我的事件日志时,它显示了我在proc.Start()之前所做的日志;(即,“将开始转换过程”)。如何解决此问题?服务问题现已解决,原始问题已得到回答。现在,您似乎在处理数据时遇到了另一个问题,因此我建议您创建一个没有服务内容的新问题。我不建议更新这个问题,因为它会污染它。谢谢你的回答。。但我仍然遇到了耗时的文件操作问题。在您提到的通过线程执行函数之后,现在服务正常启动。但问题是我的功能没有完成。当我检查我的事件日志时,它显示了我在proc.Start()之前所做的日志;(即,“将开始转换过程”)。如何解决此问题?服务问题现已解决,原始问题已得到回答。现在,您似乎在处理数据时遇到了另一个问题,因此我建议您创建一个没有服务内容的新问题。我不建议更新这个问题,因为它会污染它。