2010-12-15 18 views
10

C# içindeki bir işlemi kapatmaya çalışıyorum ama önce açık olup olmadığını nasıl kontrol ederim? Kullanıcılar bu özelliği sordu ve bazıları da diğer sürecin kapat düğmesini kullanmaya devam edecekler.C# Bir işlem var mı kontrol edin ve kapatın

Yani, şu anda gayet iyi çalışıyor:

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

Şimdi, ilk olarak var olduğundan nasıl bu işe yaramazsa:

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

cevap

17

GetProcessesByName bir süreç ilk çağrıdan sonra kapattığı yarış durumu önlemek için bu deneyin:

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

Bu kesinlikle doğru! Teşekkürler! –

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

daha mantıklı –

+0

yapacağı her türlü (kullanmaz çünkü Andy tavsiye tercih edeceksiniz, size Jani ederiz :-) –

+0

@Eric Yukarı ahbap size yapar) o linq –

4

Nasıl yaklaşık

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

Evet! çok teşekkürler! –

+0

Sevindim Yardımcı olabilirim. –

+2

Bence bu elipsin içinde bir yarış durumu saklanıyor olabilir! –

3

Ayrıca sadece döngü, hangi fi çalışır eğer yok ise.

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

Eğer makineleri geniş bir yelpazede bu uygulamayı dağıtmak için planlıyorsanız, sen Bu kodun bazen başarısız olabileceğini bilmek ister.

.NET'te Process sınıfı, bazı makinelerdeki kayıt defteri aracılığıyla devre dışı bırakılabilen Windows performans sayaçlarına dayanmaktadır. Bu olduğunda, Process.GetProcessesByName yöntemine yapılan çağrı bir istisna atar.

Bu durum, diğerlerinin yanı sıra, makinenin performansını iyileştirmek için performans sayaçlarını devre dışı bırakan çeşitli "temizleme/performans ayarlama" uygulamalarına sahip makineler için tipik bir durum olduğunu düşünüyorum. Geçtiğimiz günlerde bu durum, müşterimin müşteri makinelerinin bir kısmının tekrar tekrar tekrar ağrımasına neden oldu. Bu da beni başka bir (eğer biraz sınırlı veya hantal) alternatifi keşfetmeye götürdü, örneğin doğrudan doğruya PInvoke kullanarak Win API'ye çağrı yapmak gibi. süreçler.

Başka bir olası çözüm, yükleyicinizin veya uygulamanızın performans sayaçlarını etkinleştirmesini veya en azından devre dışı bırakılmayla nasıl baş edeceğini bilmesini sağlamaktır.

+1

Danışmanlık için teşekkürler, beni kurtardığın zaman için teşekkür ederim. –

+1

Bu proje için, yalnızca istisnayı yakalamaktan daha iyi olacağım. Bazı laboratuvarlarda performans sayaçlarının devre dışı bırakıldığından ve yönetici kararlarıyla uğraşmak iyi bir fikir olmayacağından eminim. Tekrar teşekkürler. –

İlgili konular