gelecek kullanıcılar için, burada birden fazla örnek olabilir süreçleri için özel çalışma kümesi almak için emin olmak için yapmak zorunda budur. GetNameToUseForMemory
'dan uygun işlem adını alan CurrentMemoryUsage
'u arıyorum. Bu döngüyü, olabildiğince sonuçlara göre filtrelemede bile yavaş buldum. Bu nedenle, bu nedenle, adı önbelleğe almak için bir sözlük kullanarak GetNameToUseForMemory
'u görüyorsunuz.
private static long CurrentMemoryUsage(Process proc)
{
long currentMemoryUsage;
var nameToUseForMemory = GetNameToUseForMemory(proc);
using (var procPerfCounter = new PerformanceCounter("Process", "Working Set - Private", nameToUseForMemory))
{
//KB is standard
currentMemoryUsage = procPerfCounter.RawValue/1024;
}
return currentMemoryUsage;
}
private static string GetNameToUseForMemory(Process proc)
{
if (processId2MemoryProcessName.ContainsKey(proc.Id))
return processId2MemoryProcessName[proc.Id];
var nameToUseForMemory = String.Empty;
var category = new PerformanceCounterCategory("Process");
var instanceNames = category.GetInstanceNames().Where(x => x.Contains(proc.ProcessName));
foreach (var instanceName in instanceNames)
{
using (var performanceCounter = new PerformanceCounter("Process", "ID Process", instanceName, true))
{
if (performanceCounter.RawValue != proc.Id)
continue;
nameToUseForMemory = instanceName;
break;
}
}
if(!processId2MemoryProcessName.ContainsKey(proc.Id))
processId2MemoryProcessName.Add(proc.Id, nameToUseForMemory);
return nameToUseForMemory;
}
Bunun anlamı nedir, "sayı gerçekten çok fazla değil"? Bu rakam, sürecin başka bir süreçle paylaşılamayan ne kadar belleğini temsil etmiyor? Ben süreci "art niyetli" süreçlerini öldürecek bir hizmet binası ilgilendiğim - "art niyetli" bellek birçok MB x daha fazlasını kullanarak süreçler olarak tanımlanmaktadır. Kullandığım rakamın gerçekten çok fazla bir şey ifade etmemesi durumunda hizmeti yazmaktan nefret ediyorum. Ne önerirsiniz? – sholsapp
Hayır, rakamın anlamı bu değil. Diğer işlemler tarafından paylaşılamayan bir işlem tarafından alınan "Özel Bayt", * sanal * bellek miktarını arıyorsunuz. –
Tüm söylenenler doğru olsa da, eklemek istedim, eşleşen işlem örneğini aramak için 'ProcessName' kullanmak yeterli değildir. Eğer (örneğin svchost.exe) aynı olan birden çok işlem varsa o zaman sayaç adları da parçasıdır "Kimlik Süreci" sayaç aracılığıyla eşleşmeleri gerekir vs. "svchost # 1", "svchost # 2" olacak işlem kategorisi ve 'Process.ID'. değeri önbelleğe "eski" süreç kudreti kapatma ve ınstancename olarak, çalışmaz –