如果进程崩溃/挂起,请避免锁定服务

时间:2012-06-08 14:15:28

标签: c# c#-4.0

我目前正在开发一个实现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;
   }
}

注意:此示例缩短了代码

2 个答案:

答案 0 :(得分:2)

根据MSDN,如果您的进程崩溃(重点已添加),Process.WaitForExit应返回:

  

当关联的流程退出时(也就是说,当关闭时)   操作系统通过正常或异常终止),系统   存储有关流程的管理信息并返回到   已调用WaitForExit()的组件。

看来您的HandBrake流程只是悬挂并保持活力。最好的解决方案是调试该进程并找出崩溃的位置,但不要关闭。您是否可以访问HandBrakeCLI.exe代码?

如果您无法访问HandBrake.exe代码:,可以使用Process.WaitForExit(Int32)设置超时。如果达到超时,您可能希望通过Process.Kill函数手动终止您的流程,或者对Process.Start(ProcessStartInfo)的所有后续调用都无法正常工作,因为如果流程不是,它们将只返回一个新流程'已经跑步了:

  

与流程资源相关联的新流程组件,   如果没有启动进程资源,则为null(例如,如果存在,则为   过程被重复使用)

答案 1 :(得分:1)

1) 您应该生成进程并等待它在单独的线程中终止,以避免阻塞主线程。

2) 您可以使用WaitForExit method that takes the max time to wait for the process as a parameter。然后,您就可以避免永久阻止程序线程的情况。

相关问题