2011-02-23 6 views
7

? Aquí está la pieza de código, que se ejecuta a través de todo el proceso y cuando encuentra el proceso correcto, el código envía el mensaje. Mi pregunta es qué pasó con el 'proceso', cómo deshacerse de ese proceso.¿Debo preocuparme por Process en foreach loop

//get all other (possible) running instances 
     Process[] processes = Process.GetProcesses();    
     foreach (Process proc in processes) 
     { 
      if (proc.ProcessName.ToLower() == ProcessName.ToLower()) 
      { 
       SendMessage(proc.MainWindowHandle, (uint)Message, IntPtr.Zero, IntPtr.Zero); 
      }    
     } 

Gracias de antemano, Harsa

+0

no tenga miedo :) –

+0

GC vendrá en tu ayuda! – Joe

+1

Puede ser explícito sobre las comparaciones de cadenas insensibles a mayúsculas y minúsculas con el método 'Equals':' if (proc.ProcessName.Equals (ProcessName, StringComparison.OrdinalIgnoreCase)) ' –

Respuesta

5

En términos generales no necesita preocuparse por la eliminación o desasignar objetos, a menos el objeto implementa la interfaz IDisposable. Si lo hace usted debe o bien llamar al método Dispose() en él manualmente cuando haya terminado, o envuelva con una declaración using tener que llama automáticamente:

using (var disposableObject = new DisposableType()) 
{ 
    // do work with disposableObject 
} 
+0

aunque en este caso, el código citado probablemente no está marcando el final de la vida útil de los procesos, por lo que debe dejarlos sin oposición. – Massif

+0

La instrucción 'using' es de poca ayuda en este caso porque' GetProcesses' hace toda la creación de instancias. – Groo

+1

@Massif: Dipsosing the Process object NO cerrará el proceso, sino solo su manejador al mismo. Faltar para eliminar el identificador desperdiciará recursos no administrados hasta que el GC recolecte su objeto de Proceso. – eFloh

-1

Dejar actuar a .NET Framework. Usted no necesita preocuparse de que

+2

-1. System.Diagnostics.Process hereda System.ComponentModel.Component y, por lo tanto, implementa IDisposable. Todos los objetos que implementan IDisposable se deben eliminar, ya sea usando 'using' o llamando a Dispose() directamente. – erikkallen

+1

Y, por cierto, Process.Dispose hace algo interesante. – erikkallen

-1

SI se recorre para encontrar su proceso de ganado entonces usted podría intentar algo como:

Process.GetCurrentProcess(); 

En cualquier caso me gustaría cambiarlo a:

foreach (Process proc in Process.GetProcesses()) 
    { 
     if (proc.ProcessName.ToLower() == ProcessName.ToLower()) 
     { 
      SendMessage(proc.MainWindowHandle, (uint)Message, IntPtr.Zero, IntPtr.Zero); 
     }    
    } 

Eso De esta manera, ninguna variable hará referencia a los "GetProcesses" y el GC eventualmente manejaría el problema.

+0

esto bloqueará los recursos hasta que se ejecute el GC. – eFloh

-2

La variable proc es local para el bucle foreach, por lo que una vez que se complete el bucle, se recolectará la basura automáticamente.

+0

no ayudará contra recursos colgantes hasta que el GC se ejecute – eFloh

5

Para asegurarse de que todos los recursos se liberen lo antes posible, llame a Dispose en el proceso, cuando ya no lo necesite.

//get all other (possible) running instances 
Process[] processes = Process.GetProcesses(); 
try 
{ 
    foreach (Process proc in processes) 
    { 
    // use proc 
    } 
} 
finally 
{ 
    foreach (Process proc in processes) 
     proc.Dispose(); 
    processes = null; 
} 
Cuestiones relacionadas