プロセスを使用してc#.netを介してexeファイルを実行しているときに、Windowsサービスの開始に失敗する

c# windows-services
プロセスを使用してc#.netを介してexeファイルを実行しているときに、Windowsサービスの開始に失敗する

私は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は、大きなファイルでも正常に機能します。

誰もこれを解決する方法を教えてください…​

  0  0


ベストアンサー

`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()
}

5


タイトルとURLをコピーしました