2011-02-23 12 views
7

Tüm işlem boyunca çalışan ve doğru işlemi bulduğunda kod iletiyi gönderen kod parçasıdır. Sorum şu: 'proc' ye ne oldu, bu süreci nasıl bertaraf etmeliyiz. peşinForeach döngüsünde Process hakkında endişelenmem gerekiyor

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

sayesinde Harsha

+0

korkuyor :) –

+0

GC senin yardımına koşacaktır değil olun! – Joe

+1

"Equals" yöntemiyle duyarsız dize karşılaştırmaları hakkında açık olabilirsiniz: if (proc.ProcessName.Equals (ProcessName, StringComparison.OrdinalIgnoreCase)) –

cevap

5

, sürece nesne IDisposable arabirimini uygular. Eğer otomatik olarak belirlenmesidir Bunları tamamladığınızda el üzerinde Dispose() yöntemini çağırın veya using ifadesiyle yerleştirilmeli ya yaparsa:

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

'u çalıştırana kadar kaynakların sarkmasına yardımcı olmayacaktır, ancak bu durumda, alıntılanan kod, muhtemelen işlemler için yaşamın sonunu işaretlememekte ve bu nedenle onları uygunsuz bırakmalıdır. – Massif

+0

Bu durumda 'using' ifadesi küçük bir yardımcıdır çünkü' GetProcesses 'tüm örnekleme yapar. – Groo

+1

@Massif: Proses nesnesini kaydırmak işlemi kapatmaz, sadece tutacağınızı aynı duruma getirmez. Sapı atmak için eksik, GC, Proses nesnesini toplayana kadar yönetilmeyen kaynakları harcayacaktır. – eFloh

-1

.NET Framework için üzerine bırakın. Sen zahmet ihtiyaç hakkında o

+2

-1 yapın. System.Diagnostics.Process System.ComponentModel.Component devralır ve bu nedenle IDisposable uygular. IDisposable uygulayan tüm nesneler, ya "using" kullanılarak ya da doğrudan Dispose() ile çağrılarak atılmalıdır. – erikkallen

+1

Ve btw, Process.Dispose ilginç bir şey yapar. – erikkallen

-1

o zaman böyle bir şey deneyebilirsiniz sizin kazandı süreci bulmak için döngü vardır EKLEYİN: bunu değiştirecek Her durumda

Process.GetCurrentProcess(); 

:

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

O Yani hiçbir değişken "GetProcesses" i hatırlatamaz ve GC sonunda halleder.

+0

bu, GC çalıştırılana kadar ressources'ı kilitleyecektir. – eFloh

-2

proc değişkeni, foreach döngüsünün yerelidir, böylece döngü tamamlandığında otomatik olarak çöp toplanır.

+0

, GC, – eFloh

5

Tüm rezistörlerin mümkün olduğunca erken boşaldığından emin olmak için, artık ihtiyacınız olmadığında işlemin üzerine atın. Nesneleri elden veya ayırmayı kaldırma konusunda endişelenmenize gerek yok, genel anlamda

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