C#

2010-06-30 12 views
6

ile bir bilgisayarın maksimum sabit sürücü veri aktarım hızını belirleme C# kullanan küçük bir WPF parçacığı kullanarak mevcut CPU etkinliğini, kullanılan RAM'i ve disk etkinliğini üç küçük yüzdeli tip çubuk olarak görüntüler. Bunun için, aşağıdaki PerformanceCounters kullandık: (diskCounter PerformanceCounter saniye bayt olarak mevcut toplam disk aktivitesi döner)C#

private void InitialisePerformanceCounters() 
{ 
    cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); 
    totalRam = (int)(new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory/1024/1024); 
    ramCounter = new PerformanceCounter("Memory", "Available MBytes"); 
    diskCounter = new PerformanceCounter("PhysicalDisk", "Disk Bytes/sec", "_Total", true); 
} 

Sorun keşfettim rağmen nasıl bir ikinci yüzdesini hesaplamak için toplam kullanılabilir RAM için olmasıdır Diskin 'teorik' maksimum veri aktarım hızını nasıl okuyacağımı bulamıyorum. Kullanılan disk transfer oranının yüzdesini hesaplamak için buna ihtiyacım var. Herhangi bir yardım büyük takdir edilecektir.

cevap

2

Bunu yapmanın tek yolu bunu kendiniz denemek olacaktır. Başvurunuzun başında böyle bir şey yapabileceğini: Ancak bu Temp dizin söz konusu diskte olduğunu varsayalım yok

byte[] data = new byte[1024]; 

string path = System.IO.Path.GetTempFileName(); 

int bytesPerSecond = 0; 

using (System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Create)) 
{ 
    System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch(); 

    watch.Start(); 

    for (int i = 0; i < 1024; i++) fs.Write(data, 0, data.Length); 

    fs.Flush(); 

    watch.Stop(); 

    bytesPerSecond = (int)((data.Length * 1024)/watch.Elapsed.TotalSeconds); 
} 

System.IO.File.Delete(path); 

. Aksi halde, ölçmek istediğiniz diskte bir yol oluşturmanız gerekir. Bunun okuma hızını değil, okuma hızını ölçtüğünü unutmayın.

Bu, 1MB'nin yazılacak çok fazla veri olmadığı için biraz daha elverişlidir, ancak daha büyük miktarda veriyle deneyebilirsiniz; kavram aynıdır.

+0

Mümkün olan en yüksek oranı nasıl bulacaksın? AFAIK bu, HD'nin şu anki konumuna göre değişir, bu yüzden size daha çok veya yanlış bir sonuç verir mi? – InsertNickHere

+0

@InsertNickHere: Maksimum olası hızı ölçmenin tek yolu tüm diske yazmak ve aralıklarla ölçmek olacaktır. Bunun bir takım faktörlere bağlı olduğu konusunda haklısınız, ancak bu en azından kullanılabilir bir yaklaşım sağlamalıdır. –

+0

Teşekkürler Adam, ama çok doğru bir şeye ihtiyacım yok ... Jonathan'ın önerdiği teorik maksimum oran iyidir. – Sheridan

1

WMI api'yi kullanmayı deneyin, ayrıca LINQ to WMI yardımcı olabilir.

+0

Bağlantılar için teşekkürler ... Yer işareti ekledim. :) – Sheridan

1

Bir HD'nin maksimum veri aktarım hızını elde etmenin bir yolunu bilmiyorum, ancak WMI ile sabit diskin giriş yüzeyini (USB, IDE ...) elde edebilirsiniz. Arayüzün maksimum veri aktarım hızını kullanabilir ve yüzdesini ona yansıtabilirsiniz. Ayrıca, kaynak kodu ile WMI'yi kullanarak bilgi edinme hakkında küçük bir makaleye burada bir bağlantı bırakacağım. LINK

+0

Teşekkürler, bu benim peşinde olduğum gibi geliyor. Bağlantı için de teşekkürler, ancak Win32_LogicalDisk sınıfı hakkında konuşuyorsanız, bu bilgiyi sağlayan uygun alan/özniteliği bulamadım ... bunu biliyor musunuz? – Sheridan

+1

Ben onun InterfaceType düşünüyorum - http://msdn.microsoft.com/en-us/library/aa394132(VS.85).aspx İşte bir örnek: http://www.geekpedia.com/tutorial73_An-introduction-in -evrimleşme-WMI-in-Csharp.html – SwDevMan81

+0

Teşekkürler SwDevMan81, Ben onu bir vereceğim. – Sheridan