我目前正在开发一个实现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;
}
}
注意:此示例缩短了代码
答案 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。然后,您就可以避免永久阻止程序线程的情况。