2012-08-23 20 views
5

Tengo este código básico que comprobará si el bloc de notas se ejecuta cada minuto.Verificar si el proceso se ejecuta cada minuto

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); 
      } 
     } 
    } 
} 

El problema es que se vuelve "NFalse" para cada proceso en ejecución (Se imprimirá 100 de ellos, por ejemplo). ¿Cómo puedo hacer esta impresión una vez para mostrar que el proceso no se está ejecutando?

Respuesta

7

Refacte su código.

Estás haciendo demasiado en un método. Poner el código que comprueba para ver si el bloc de notas se está ejecutando en un método separado:

static bool CheckIfProcessIsRunning(string nameSubstring) 
{ 
    foreach (Process clsProcess in Process.GetProcesses()) 
    { 
     if (clsProcess.ProcessName.Contains(nameSubstring)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

Se podría simplificar esta usando más LINQ:

static bool CheckIfProcessIsRunning(string nameSubstring) 
{ 
    return Process.GetProcesses().Any(p => p.ProcessName.Contains(nameSubstring)); 
} 

vez que haya escrito este método, todo lo que queda es llámalo e imprime el mensaje correcto dependiendo de si devuelve verdadero o falso.

while (true) 
{ 
    string message = CheckIfProcessIsRunning("notepad") ? "True" : "NFalse"; 
    Console.WriteLine(message); 
    Thread.Sleep(10000); 
} 

Ahora, en lugar de un método largo con lógica compleja, tiene dos métodos muy simples.

+0

Se requiere una referencia de objeto para el campo no estático, método o propiedad 'Watcher.Program.CheckIfProcessIsRunning (cadena) me sale esto cuando utilice CheckIfProcessIsRunning ('bloc de notas') – user1372896

+0

@ user1372896: He actualizado el código para hacer el método estático. –

2

Solo necesita comprobar el proceso que le interesa. No se moleste en recorrer todos los procesos en ejecución. Use Process.GetProcessByName().

for (int i = 0; ; i--) 
{ 
    Process[] processes = Process.GetProcessByName("notepad++.exe"); 
    if(processes.Length > 0){ 
      Console.WriteLine("True"); 
    } 
    else{ 
      Console.WriteLine("NFalse"); 
    } 

    Thread.Sleep(10000); 
} 
+0

Correcto, leí la pregunta al principio. Ver ediciones –

0

acaba de cambiar a esta, por lo que sólo se imprimen una vez.

var b = false; 
foreach (Process clsProcess in Process.GetProcesses()) 
      { 
       if (clsProcess.ProcessName.Contains("notepad")) 
       { 
        if (!b) b = true; 
       } 
      } 
       Console.WriteLine(b); 
0

Bueno, esto parece funcionar bien.

Dim x = Process.GetProcesses().ToList().FirstOrDefault(Function(p) p.ProcessName.Contains("Notepad")) 
if x Is Nothing then 
    Console.WriteLine("false") 
end if 
Cuestiones relacionadas