5

私は毎分実行されているメモ帳をチェックするこの基本的なコードを持っています。

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個のプロセスを出力します)。プロセスが実行されていないことを示すために、この印刷を1回だけ行うにはどうすればよいですか?

4

4 に答える 4

7

コードをリファクタリングします。

1つの方法でやりすぎです。メモ帳が実行されているかどうかを確認するコードを別のメソッドに配置します。

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つの非常に単純なメソッドがあります。

于 2012-08-23T21:24:12.837 に答える
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);
}
于 2012-08-23T21:24:47.223 に答える
0

これに変更するだけなので、一度だけ印刷できます。

var b = false;
foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.Contains("notepad"))
                {
                    if (!b) b = true;
                }
            }
                Console.WriteLine(b);
于 2012-08-23T21:24:50.013 に答える
0

まあ、これはうまくいくようです。

Dim x = Process.GetProcesses().ToList().FirstOrDefault(Function(p) p.ProcessName.Contains("Notepad"))
if x Is Nothing then
    Console.WriteLine("false")
end if
于 2012-08-23T21:33:29.380 に答える