我有一个程序启动另一个程序(iexplore.exe),然后我的程序应该“隐形”或atlast到后台,并在asd.exe运行时保持在那里。这段代码正在运行,但是它占用内存,有时它只是在asd.exe不再运行时保持隐藏状态。必须有一个更有效的方法来做到这一点=) 所以我的程序代码:
this.Hide();
Process.Start(Path.Combine(Path, "iexplore.exe"));
Process[] Running_ = null;
do
{ // this loops eats memory!
System.Threading.Thread.Sleep(500);
Running_ = null;
Running_ = Process.GetProcessesByName("iexplore");
}while (Running_.Length > 0);
this.Show();
答案 0 :(得分:4)
您需要在此处使用Process.Exited事件,以防止阻止UI线程并避免麻烦线程。像这样:
private void button1_Click(object sender, EventArgs e) {
var prc = new Process();
prc.EnableRaisingEvents = true;
prc.Exited += processExited;
prc.StartInfo = new ProcessStartInfo("notepad.exe");
prc.Start();
this.Hide();
}
private void processExited(object sender, EventArgs e) {
this.BeginInvoke(new Action(() => {
this.Show();
this.BringToFront();
}));
}
答案 1 :(得分:3)
Process.WaitForExit方法怎么样?
this.Hide();
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
this.Show();
答案 2 :(得分:3)
我喜欢MatthiasG所做的事情,但是WaitForExit()是一个阻塞调用...你的程序将被隐藏,直到asd.exe完成执行,但你的程序将无法正常工作。
这可能是期望的结果。如果没有,我会
this.Hide();
创建一个线程(BackgroundWorker就足够了)...在DoWork()事件中,为asd创建Process对象(如MatthiasG所做的那样):
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
在RunWorkerCompleted事件中,有this.Show();
答案 3 :(得分:1)
答案 4 :(得分:0)
你需要在数组中的每个对象上调用Dispose()
,然后停止吃内存。
我的意思是代替WoWRunning_ = null;
而不是foreach(Process p in WoWRunning_) p.Dispose();
但无论如何你的算法应该完全修改,因为你一次又一次地加载所有进程的数组,所以它非常昂贵。