2011-02-23 13 views
7

Ecco la parte di codice, che esegue tutto il processo e quando trova il processo corretto, il codice invia il messaggio. La mia domanda è cosa è successo al "proc", come smaltire quel processo.Devo preoccuparmi del processo nel ciclo foreach

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

Grazie in anticipo, Harsha

+0

Non abbiate paura :) –

+0

GC verrà in vostro aiuto! – Joe

+1

È possibile essere espliciti sui confronti tra maiuscole e minuscole con il metodo 'Equals':' if (proc.ProcessName.Equals (ProcessName, StringComparison.OrdinalIgnoreCase)) ' –

risposta

5

In termini generali non è necessario preoccuparsi di smaltimento o deallocando oggetti, a meno che l'oggetto implementa l'interfaccia IDisposable. Se è così si dovrebbe o chiamare il metodo Dispose() su di esso manualmente quando hai finito, o avvolgere con una dichiarazione using per averlo chiamato automaticamente:

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

anche se in questo caso il codice indicato probabilmente non segna la fine della vita per i processi, e quindi dovrebbe lasciarli non esposti. – Massif

+0

L'istruzione 'using' non è di grande aiuto in questo caso perché' GetProcesses' fa tutta l'istanza. – Groo

+1

@Massif: Dipsosing l'oggetto Process NON chiuderà il processo, ma solo il tuo handle allo stesso. Manca di disporre l'handle sprecare risorse non gestite fino a quando il GC non raccoglierà l'oggetto Process. – eFloh

-1

lasciarlo acceso per .NET Framework. Non c'è bisogno di preoccuparsi di esso

+2

-1. System.Diagnostics.Process eredita System.ComponentModel.Component e pertanto implementa IDisposable. Tutti gli oggetti che implementano IDisposable dovrebbero essere eliminati, usando 'using' o chiamando Dispose() direttamente. – erikkallen

+1

E btw, Process.Dispose fa qualcosa di interessante. – erikkallen

-1

se siete loop per trovare il tuo processo vinto allora si potrebbe provare qualcosa di simile:

Process.GetCurrentProcess(); 

In ogni caso vorrei cambiarlo:

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

Quello in questo modo nessuna variabile si riferirà al "GetProcesses" e il GC alla fine lo gestirà.

+0

bloccerà le risorse finché non verrà eseguito il GC. – eFloh

-2

La variabile proc è locale al ciclo foreach quindi, una volta completato il ciclo, verrà automaticamente raccolto.

+0

non aiuta a limitare le risorse finché il GC non verrà eseguito – eFloh

5

Per assicurarsi che tutti i resiucer siano stati liberati il ​​prima possibile, chiamate Smaltimento sul processo, quando non ne avete più bisogno.

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