#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();
Эти строки заставят пользовательский интерфейс обновить и приостановить проверку вашего процесса, но на самом деле они хороши только для тестирования / разработки. Поскольку это приведет к задержке всех ваших процессов, что не очень хорошо для производственной среды.