如何将我的程序发送到后台,而某个进程正在运行
本文关键字:进程 运行 后台 我的 程序 | 更新日期: 2023-09-27 18:10:08
我有一个启动另一个程序(iexplorer .exe)的程序,然后我的程序应该"不可见"或最后到后台,并在此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();
您将需要使用Process。退出事件在这里,防止阻塞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();
}));
}
流程如何?WaitForExit方法?
this.Hide();
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
this.Show();
我喜欢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();
- 不需要null WoWRunning_。的过程。GetProcessesByName无论如何都会更改引用
- Call .Dispose() !
你需要在数组中的每个对象上调用Dispose()
,然后它停止消耗内存。
我的意思是把WoWRunning_ = null;
换成foreach(Process p in WoWRunning_) p.Dispose();
但无论如何你的算法应该完全修改,它是相当昂贵的,因为你加载所有进程的数组一次又一次。