2011-02-23 60 views
7

這是一段代碼,它貫穿所有進程,當它找到正確的進程時,代碼發送消息。我的問題是'proc'發生了什麼,如何處理這個過程。我是否需要擔心在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); 
      }    
     } 

由於提前, 戒

+0

是不怕:) –

+0

GC會來幫你的忙! – Joe

+1

您可以使用「Equals」方法明確區分不區分大小寫的字符串比較:if(proc.ProcessName.Equals(ProcessName,StringComparison.OrdinalIgnoreCase))' –

回答

5

在你不需要擔心處置或重新分配對象總體而言,除非對象實現IDisposable接口。如果是這樣,你應該可以手動調用Dispose()方法就可以了,當你完成後,或用using聲明包,系統將自動調用:

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

儘管在這種情況下,所引用的代碼可能不會標記進程的生命結束,因此應該使它們不存在。 – Massif

+0

'using'語句在這種情況下幫助不大,因爲'GetProcesses'完成所有的實例化。 – Groo

+1

@Massif:忽略過程對象將不會關閉該過程,但只有您的處理相同。丟失句柄會浪費非託管資源,直到GC收集您的Process對象。 – eFloh

-1

把它留到.NET Framework。你不必理會

+2

-1。 System.Diagnostics.Process繼承System.ComponentModel.Component,並因此實現IDisposable。所有實現IDisposable的對象都應該使用'using'或直接調用Dispose()來處理。 – erikkallen

+1

順便說一句,Process.Dispose做了一些有趣的事情。 – erikkallen

-1

,如果你是循環找到你贏了過程,那麼你可以嘗試這樣的:

Process.GetCurrentProcess(); 

在任何情況下,我將其更改爲:

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

那方式沒有變量會引用「GetProcesses」和GC將最終處理它。

+0

這將鎖定資源直到GC運行。 – eFloh

-2

變量proc對於foreach循環是局部的,所以一旦循環完成,它將自動被垃圾收集。

+0

不會對懸浮資源有所幫助,直到GC將運行 – eFloh

5

要確保所有資源儘早釋放,請在流程中調用Dispose,而不再需要它。

//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; 
} 
相關問題