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

本文关键字:进程 运行 后台 我的 程序 | 更新日期: 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完成执行,但您的程序将不会做任何生产性的事情。

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

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

    Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
    p.WaitForExit();
    
  3. 在RunWorkerCompleted事件中,有this.Show();
  • 不需要null WoWRunning_。的过程。GetProcessesByName无论如何都会更改引用
  • Call .Dispose() !

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

我的意思是把WoWRunning_ = null;换成foreach(Process p in WoWRunning_) p.Dispose();

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