从Form启动外部exe然后等待它生成一个文件,或关闭

时间:2012-10-25 15:21:50

标签: c# visual-studio-2010

我想做一些非常简单的事情,我希望有一种简单的方法可以做到这一点!

  1. 按下按钮从我的用户表单应用程序启动外部exe(例如,使用Process.Start()。)。
  2. 在我的应用程序中等待此exe生成一个已知文件,或关闭。 (除了等待之外,我不需要在我的应用程序中进行任何其他活动)
  3. 如果exe已生成所需文件,则应自动终止(大概使用Process.Kill()
  4. 在此阶段,我的表单输入应该返回活动状态。

    启动的exe有自己的UI,我的用户在激活时会使用它。 我认为这个问题的关键在于有效地进行等待。我假设我可以启动一个定时器循环,它将每隔几百毫秒监视文件的外观和启动的exe的关闭。

    PC在当时几乎没有其他功能,在我认为的情况下,简单性胜过效率。

5 个答案:

答案 0 :(得分:4)

你有基本的想法。

  1. Process.Start将启动此过程。
  2. Process.WaitForExit将阻止,直到应用程序完成
  3. 根据你的第二点(见上文)
  4. ,你不应该杀死它,因为它会完成

    如果可执行文件实际上没有成功完成,您还可以使用FileSystemWatcher来监视输出文件的更改,然后使用Process.CloseMainWindowProcess.Kill来终止它输出正确生成。

答案 1 :(得分:3)

您可以使用Process上的WaitForExit方法等待进程退出。

答案 2 :(得分:0)

您可以使用FileSystemWatcher来查看新文件,并查看Process.Exited事件,了解您的应用是否已关闭。

答案 3 :(得分:0)

你可以在没有循环的情况下进行等待。 “Process”的API有其他选项来完成所需的任务。

            var procStartInfo = new ProcessStartInfo(@"cmd", "/c " + @"ping 127.0.0.1 -n 10")
            {
                RedirectStandardOutput = true,
                UseShellExecute = false,
                CreateNoWindow = true
            };

            var proc = new Process { StartInfo = procStartInfo };
            result = await Task<string>.Factory.StartNew(() =>
            {
                proc.Start();
                proc.WaitForExit();
                return proc.StandardOutput.ReadToEnd();
            }, TaskCreationOptions.PreferFairness);

代码适用于.NET 4.5,以便您的UI在等待期间保持响应。如果您愿意,可以使用.NET 4.0进行简单调用。 使进程执行等待的代码行是:proc.WaitForExit(); 在这个例子中,我使用shell命令来执行。但是你可以调用任何可执行的进程。

AND

以“只读模式”观看文件的示例,以便它不会给出“另一个进程正在使用它”错误

this.fileFullPath = filePath + @"\" + fileName;
        this.fileSystemWatcher = new FileSystemWatcher(filePath);
        this.fileSystemWatcher.Filter = fileName;
        this.fileSystemWatcher.NotifyFilter = NotifyFilters.FileName;
        this.fileSystemWatcher.Created += new FileSystemEventHandler(FileSystemWatcherCreated);
        this.fileSystemWatcher.Changed += new FileSystemEventHandler(FileSystemWatcherChanged);
        ////this.fileSystemWatcher.Error += new ErrorEventHandler(FileSystemWatcherError);
        ////this.fileSystemWatcher.Renamed += new RenamedEventHandler(FileSystemWatcherRenamed);
        ////this.fileSystemWatcher.Deleted += new FileSystemEventHandler(FileSystemWatcherDeleted);
        this.fileSystemWatcher.EnableRaisingEvents = true;

最后一行“EnableRaisingEvents将使事件通知成为现实,”NotifyFilter“将帮助您监视目录或文件的不同属性和行为。

希望有所帮助

答案 4 :(得分:0)

导入System.Diagnostics,将其添加到您的使用中,然后尝试以下代码:

Process extProc = new Process();
extProc.StartInfo.FileName = "extProc.exe";
extProc.StartInfo.Arguments = "argument string";
extProc.Exited += new EventHandler(extProc_Exited);
extProc.Start();

然后处理退出的事件

private void extProc_Exited(object sender, EventArgs e)
{
     Process thisProc = (Process)sender;
     if(thisProc.ExitCode == 1)
     {
         // success
     }
     else 
     {
         // error encountered
     }
}