1

現在、 fileSystemWatcherを実装する Windows サービスを開発しています。動画がフォルダーにアップロードされた時点で、filewatcher は作成されたイベントを以下のように起動して動画を変換します。

private void fileSystemWatcher_Created(object sender, System.IO.FileSystemEventArgs e)
{
  if (ConvertVideo(e.FullPath, e.Name))
  {
    WriteToEventLog(String.Format("Successfully converted video - {0}", e.FullPath), EventLogEntryType.Information);
  }            
}

新しいプロセス内で作成されますが、プロセスがクラッシュ/ハング/非表示になるという問題が発生し、他のビデオを変換できないConvertVideoため、メインスレッドが待機中にロックされ、サービスが効果的にクラッシュするように見えます。WaitForExit()プロセスが終了した場合にサービス全体をロックしないようにするにはどうすればよいですか?

private bool ConvertVideo(string SourcePath, string Filename)
{   
   try
   {
      // Create new process
      ProcessStartInfo startInfo = new ProcessStartInfo();
      startInfo.CreateNoWindow = false;
      startInfo.UseShellExecute = false;
      startInfo.FileName = "C:\Handbrake\HandBrakeCLI.exe";
      startInfo.WindowStyle = ProcessWindowStyle.Hidden;
      startInfo.Arguments = GetArguments(SourcePath, Filename);
      int? exitCode = null;
      using (Process exeProcess = Process.Start(startInfo))
      {
        exeProcess.WaitForExit();
        exitCode = exeProcess.ExitCode;
      }
   }
   catch(Exception ex)
   {
     return false;
   }
}

注: この例ではコードが短縮されています

4

2 に答える 2

2

MSDNによると、Process.WaitForExitは、プロセスがクラッシュした場合に返されるはずです(強調が追加されています)。

関連するプロセスが終了すると(つまり、正常終了または異常終了によってオペレーティングシステムによってシャットダウンされると)、システムはプロセスに関する管理情報を保存し、WaitForExit()を呼び出したコンポーネントに戻ります。

あなたのHandBrakeプロセスはただぶら下がっていて生き続けているようです。最善の解決策は、そのプロセスをデバッグし、クラッシュしている場所を特定することですが、終了することはありません。HandBrakeCLI.exeコードにアクセスできますか?

HandBrake.exeコードにアクセスできない場合は、 Process.WaitForExit(Int32)を使用してタイムアウトを設定できます。タイムアウトに達した場合は、Process.Kill関数を使用してプロセスを手動で強制終了する必要があります。そうしないと、プロセスがなかった場合にのみ新しいプロセスが返されるため、Process.Start(ProcessStartInfo)への後続のすべての呼び出しは正しく機能しません。すでに実行中:

プロセスリソースに関連付けられている新しいプロセスコンポーネント。プロセスリソースが開始されていない場合(たとえば、既存のプロセスが再利用されている場合)はnull

于 2012-06-08T14:26:35.853 に答える
1

1) メインスレッドのブロックを避けるために、プロセスを生成し、別のスレッドで終了するのを待つ必要があります。

2)WaitForExitパラメータとして、プロセスの待機に最大時間がかかるメソッドを使用できます。その後、プログラムのスレッドが永久にブロックされるケースを回避できます。

于 2012-06-08T14:22:58.050 に答える