我有这个基本代码,可以检查每分钟运行的记事本。
namespace Watcher
{
class Program
{
static void Main(string[] args)
{
for (int i = 0; ; i--)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Contains("notepad"))
{
Console.WriteLine("True");
}
Console.WriteLine("NFalse");
}
Thread.Sleep(10000);
}
}
}
}
问题是它为每个正在运行的进程返回“NFalse”(例如,它将打印100个)。如何才能使此打印一次显示该过程未运行?
答案 0 :(得分:7)
重构您的代码。
你在一种方法中做得太多了。将检查记事本的代码放入单独的方法中
static bool CheckIfProcessIsRunning(string nameSubstring)
{
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Contains(nameSubstring))
{
return true;
}
}
return false;
}
您可以使用LINQ进一步简化此操作:
static bool CheckIfProcessIsRunning(string nameSubstring)
{
return Process.GetProcesses().Any(p => p.ProcessName.Contains(nameSubstring));
}
一旦你编写了这个方法,剩下的就是调用它并打印正确的消息,具体取决于它是返回true还是false。
while (true)
{
string message = CheckIfProcessIsRunning("notepad") ? "True" : "NFalse";
Console.WriteLine(message);
Thread.Sleep(10000);
}
现在不是一个具有复杂逻辑的长方法,而是有两个非常简单的方法。
答案 1 :(得分:2)
您只需要检查您感兴趣的进程。不要在所有正在运行的进程上循环。使用Process.GetProcessByName()。
for (int i = 0; ; i--)
{
Process[] processes = Process.GetProcessByName("notepad++"); // Without extension
if(processes.Length > 0){
Console.WriteLine("True");
}
else{
Console.WriteLine("False");
}
Thread.Sleep(10000);
}
答案 2 :(得分:0)
只需更改为此,因此您只需打印一次。
var b = false;
foreach (Process clsProcess in Process.GetProcesses())
{
if (clsProcess.ProcessName.Contains("notepad"))
{
if (!b) b = true;
}
}
Console.WriteLine(b);
答案 3 :(得分:0)
这似乎运作良好。
Dim x = Process.GetProcesses().ToList().FirstOrDefault(Function(p) p.ProcessName.Contains("Notepad"))
if x Is Nothing then
Console.WriteLine("false")
end if