Постоянно проверять, открыт ли процесс

#c#

#c#

Вопрос:

Я хочу постоянно проверять, запущен ли фоновый процесс или нет, у меня есть только одна метка (для отображения результата), мой код, который показывает, запущен он или нет, является:

 Process[] plist = Process.GetProcessesByName("chrome");
        if (plist.Length > 0)
        {
            label1.ForeColor = Color.Green;
            label1.Text = "FOUND";
        }
        else 
        {
            label1.ForeColor = Color.Red;
            label1.Text = "NOT FOUND";
        }
 

И когда я запускаю его, он работает, но когда я закрываю процесс, он по-прежнему показывает «НАЙДЕНО», как я могу заставить его всегда проверять, есть ли список.Длина равна 0 или> 0?
p.s: Я попробовал несколько повторяющихся вопросов и т. Д., И у меня это не сработало.

Комментарии:

1. Похоже, что ваш код на самом деле всегда проверяет, является ли plist . Длина больше 0, поэтому я не верю, что это ваша проблема. Похоже, что ваш процесс либо фактически не закрывается, либо он закрыт, но все еще отображается, что приводит к тому, что plist всегда будет больше 0

2. @dogyear Спасибо за ответ, но я почти уверен, что он закрывается, и я считаю, что он просто проверяет, равно ли оно 0 или> 0 во время выполнения, а не постоянно.

3. Если это так, тогда обрабатывайте. GetProcessesByName(«chrome»), вероятно, не возвращает список процессов, о которых вы думаете, потому что, если вы пройдетесь по своему коду в отладчике, я полагаю, вы увидите, что он проверяет длину plist при каждом запуске, а plist больше 0. Я бы обязательно прошел через отладчик и посмотрел, что на самом деле делает код, если вы еще этого не сделали

4. Нам понадобится немного больше кода, чтобы увидеть, что вы делаете в контексте. Это в цикле, таймере и т. Д.. почему вы ожидаете, что он будет выполняться более одного раза?

Ответ №1:

 using System;
using System.Diagnostics;

namespace Program
{
  class Program
  {
    static void Main(string[] args)
    {
      Process[] plist = Process.GetProcessesByName("msedge");
      if (plist.Length > 0)
      {
        Console.WriteLine(plist[0].ProcessName);
      }
      else
      {
        Console.WriteLine("NotFound");
      }
    }
  }
}
 

Приведенный выше код, похоже, работает просто отлично. Я бы проверил две вещи:

  • откройте диспетчер диспетчер задачзадач убедитесь, что все процессы Chrome закрыты, даже если ваш веб-браузер Chrome закрыт, здесь могут быть некоторые открытые. Я использовал msedge, и, похоже, он работал просто отлично.
  • Возможно, вы сильно зациклили свой поток пользовательского интерфейса. Это означает, что он настолько занят проверкой процессов, что у него нет времени обновлять вашу метку. обычно вы не выполняете подобные задачи в потоке пользовательского интерфейса, а вместо этого прерываете их в побочных потоках. В качестве альтернативы вы можете использовать таймер в главном потоке, проверять каждые пару миллисекунд. Последний, но плохой способ сделать это — вызвать:
 label1.Invalidate();
Application.DoEvents();
 

Эти строки заставят пользовательский интерфейс обновить и приостановить проверку вашего процесса, но на самом деле они хороши только для тестирования / разработки. Поскольку это приведет к задержке всех ваших процессов, что не очень хорошо для производственной среды.