2

我想做一些非常简单的事情,我希望有一个简单的方法来做!

  1. 按下按钮从我的用户表单应用程序启动一个外部 exe(Process.Start()例如使用?)。
  2. 在我的应用程序中等待此 exe 生成已知文件或关闭。(除了等待之外,我不需要在我的应用程序中进行任何其他活动)
  3. 如果 exe 生成了所需的文件,它应该被自动杀死(Process.Kill()大概使用)

在这个阶段,我的表单输入应该恢复为活动状态。

启动的 exe 有自己的 UI,我的用户将在它处于活动状态时使用它。我认为关键在于有效地等待。我假设我可以启动一个计时器循环,它将每隔几百毫秒监视文件的出现和启动的 exe 的关闭。

当时,PC 几乎不会做任何其他事情,在我感觉的这些情况下,简单性胜过效率。

4

5 回答 5

4

你有基本的想法。

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

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

于 2012-10-25T15:26:12.013 回答
3

您可以使用WaitForExiton 方法Process等待进程退出。

于 2012-10-25T15:25:25.760 回答
0

您可以在没有循环的情况下进行等待。“流程”的 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 命令来执行。但是您可以调用任何可执行进程。

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

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”将帮助您观察目录或文件的不同属性和行为。

希望有帮助

于 2012-10-25T15:30:01.603 回答
0

您可以使用FileSystemWatcher来监视您的新文件,您可以查找Process.Exited事件以查看您的应用程序是否已关闭。

于 2012-10-25T15:28:20.917 回答
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
     }
}
于 2012-10-25T15:32:44.980 回答