我想做一些非常简单的事情,我希望有一种简单的方法可以做到这一点!
Process.Start()
。)。Process.Kill()
)在此阶段,我的表单输入应该返回活动状态。
启动的exe有自己的UI,我的用户在激活时会使用它。 我认为这个问题的关键在于有效地进行等待。我假设我可以启动一个定时器循环,它将每隔几百毫秒监视文件的外观和启动的exe的关闭。
PC在当时几乎没有其他功能,在我认为的情况下,简单性胜过效率。
答案 0 :(得分:4)
你有基本的想法。
Process.Start
将启动此过程。Process.WaitForExit
将阻止,直到应用程序完成如果可执行文件实际上没有成功完成,您还可以使用FileSystemWatcher
来监视输出文件的更改,然后使用Process.CloseMainWindow
或Process.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
}
}