如何在某个进程运行时将我的程序发送到后台

时间:2011-09-28 14:35:22

标签: c# multithreading process wait

我有一个程序启动另一个程序(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();

5 个答案:

答案 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完成执行,但你的程序将无法正常工作。

这可能是期望的结果。如果没有,我会

  1. 隐藏表单 - > this.Hide();
  2. 创建一个线程(BackgroundWorker就足够了)...在DoWork()事件中,为asd创建Process对象(如MatthiasG所做的那样):

    Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
    p.WaitForExit();
    
  3. 在RunWorkerCompleted事件中,有this.Show();

答案 3 :(得分:1)

  • 无需废弃WoWRunning_。 Process.GetProcessesByName无论如何都会更改引用
  • 致电.Dispose()!

答案 4 :(得分:0)

你需要在数组中的每个对象上调用Dispose(),然后停止吃内存。

我的意思是代替WoWRunning_ = null;而不是foreach(Process p in WoWRunning_) p.Dispose();

但无论如何你的算法应该完全修改,因为你一次又一次地加载所有进程的数组,所以它非常昂贵。