Как отправить мою программу в фоновый режим во время работы определенного процесса - PullRequest
1 голос
/ 28 сентября 2011

У меня есть программа, которая запускает другую программу (iexplore.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();

Ответы [ 5 ]

4 голосов
/ 28 сентября 2011

Здесь вы захотите использовать событие Process.Exited, предотвращающее блокировку потока пользовательского интерфейса и предотвращающее излишнее потоки.Как это:

    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();
        }));
    }
3 голосов
/ 28 сентября 2011

Мне нравится то, что сделал MatthiasG, но WaitForExit () является блокирующим вызовом ... Ваша программа будет скрыта, пока не завершится выполнение asd.exe, но ваша программа не будет делать ничего продуктивного.

Этоможет быть желаемый результат.Если нет, я бы

  1. Скрыть форму -> this.Hide();
  2. Создать поток (будет достаточно BackgroundWorker) ... В событии DoWork () создайтеобъект Process для asd (как это сделал MatthiasG):

    Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
    p.WaitForExit();
    
  3. В событии RunWorkerCompleted укажите this.Show();

3 голосов
/ 28 сентября 2011

А как насчет метода Process.WaitForExit?

this.Hide();
Process p = Process.Start(Path.Combine(WoWPath, "asd.exe"));
p.WaitForExit();
this.Show();
1 голос
/ 28 сентября 2011
  • Нет необходимости обнулять WoWRunning_.Process.GetProcessesByName изменяет ссылку в любом случае
  • Вызов .Dispose ()!
0 голосов
/ 28 сентября 2011

Вам нужно вызвать Dispose() для каждого объекта в вашем массиве, тогда он перестанет есть память.

Я имею в виду вместо WoWRunning_ = null; поставить что-то вроде foreach(Process p in WoWRunning_) p.Dispose();

Но в любом случае ваш алгоритм должен быть полностью пересмотрен, это довольно дорого, потому что вы загружаете массив всех процессов снова и снова.

...