2010-12-15 19 views
10

Estoy intentando cerrar un proceso dentro de C#, pero ¿cómo puedo verificar si está abierto primero? Los usuarios pidieron esta característica y algunos de ellos seguirán usando el botón Cerrar del otro proceso.C# compruebe si existe un proceso y luego ciérrelo

Por lo tanto, en este momento funciona bien:

Process.GetProcessesByName("ProcessName")[0].CloseMainWindow(); 

Ahora, ¿cómo puedo comprobar primero que existe, esto no funciona:

if (Process.GetProcessesByName("ProcessName")[0] != null) {...} 

Respuesta

17

probar este para evitar la condición de carrera en el que un proceso se cierra después de la primera llamada a GetProcessesByName:

Process[] processes = Process.GetProcessesByName("ProcessName"); 
if (processes.Length > 0) 
    processes[0].CloseMainWindow(); 
+0

¡Eso es absolutamente correcto! ¡Gracias! –

2
Process.GetProcessesByName("ProcessName").FirstOrDefault() != null 
+0

Gracias Jani, voy a prefiero el consejo Andy, ya que no utiliza LINQ –

+0

.Any() tiene más sentido –

+0

@Eric Hasta que tipo :-) –

4

¿Qué tal

if (Process.GetProcessesByName("ProcessName").Length > 0) {...} 
+0

¡Sí! ¡muchas gracias! –

+0

Me alegro de poder ayudar. –

+2

¡Creo que una condición de carrera puede estar escondida dentro de esa elipsis! –

3

También podría simplemente bucle, que funciona fi ne si no hay ninguno.

foreach(Process p in Process.GetProcessesByName("ProcessName")) 
{ 
    p.CloseMainWindow(); 
} 
7

Si usted está pensando en implementar esta aplicación en una amplia gama de equipos, querrá saber que este código a veces puede fallar.

La clase Process en .NET se basa en los contadores de rendimiento de Windows, que en algunas máquinas se pueden deshabilitar a través del registro. Cuando esto sucede, la llamada al método Process.GetProcessesByName lanzará una excepción.

Creo que esta situación es típica para máquinas con varias aplicaciones de "limpieza/ajuste de rendimiento" que, entre otras cosas, desactivan los contadores de rendimiento para supuestamente mejorar el rendimiento de la máquina.

En el pasado, esto me causaba dolor en algunos porcentajes de las máquinas cliente de mis clientes, lo que me llevó a explorar otras alternativas (por más limitadas o engorrosas), como hacer llamadas a Win API directamente usando PInvoke para iterar los procesos.

Otra posible solución sería asegurar que su instalador o aplicación habilite los contadores de rendimiento, o al menos sepa cómo manejarlos.

+1

Gracias por aconsejar Ran, le agradezco el tiempo que me está ahorrando. –

+1

Para este proyecto, estaré mejor solo atrapando la excepción. Estoy bastante seguro de que en algunos laboratorios los contadores de rendimiento están deshabilitados y no será una buena idea meterse con las decisiones administrativas. Gracias de nuevo. –

Cuestiones relacionadas