2010-06-30 27 views
6

Tôi đã viết một widget WPF nhỏ sử dụng C# hiển thị hoạt động CPU hiện tại, RAM được sử dụng và hoạt động đĩa dưới dạng ba thanh loại phần trăm nhỏ. Tôi đã sử dụng các PerformanceCounters sau cho việc này: (diskCounter PerformanceCounter trả về tổng số hoạt động đĩa hiện theo byte mỗi giây)Xác định tốc độ truyền dữ liệu ổ cứng tối đa của máy tính theo lập trình với 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); 
} 

Vấn đề là mặc dù tôi đã khám phá ra làm thế nào để có được tổng RAM có sẵn để tính toán một tỷ lệ phần trăm đã qua sử dụng từ , Tôi không thể tìm hiểu cách đọc tốc độ truyền dữ liệu tối đa 'lý thuyết' của đĩa. Tôi cần điều này để tính tỷ lệ phần trăm tốc độ truyền đĩa được sử dụng. Bất kỳ trợ giúp nào sẽ được đánh giá cao.

Trả lời

2

Cách duy nhất để thực hiện việc này là tự mình kiểm tra. Bạn có thể làm điều gì đó tương tự như vậy vào đầu đơn đăng ký của mình:

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

Tuy nhiên, điều này giả định rằng thư mục Temp nằm trên đĩa được đề cập. Nếu không, bạn sẽ phải tạo một đường dẫn trên đĩa bạn muốn đo. Lưu ý rằng điều này là đo tốc độ ghi, không đọc tốc độ.

Điều này phần nào được giả tạo vì 1MB không có nhiều dữ liệu để viết, nhưng bạn có thể dùng thử với số lượng dữ liệu lớn hơn; khái niệm là như nhau.

+0

bạn sẽ tìm thấy mức giá tối đa có thể như thế nào? AFAIK này phụ thuộc vào vị trí hiện tại của HD, do đó, điều này sẽ nhiều hơn hoặc ít hơn cung cấp cho bạn một kết quả sai, hay không? – InsertNickHere

+0

@InsertNickHere: Cách duy nhất để đo lường tốc độ tối đa có thể là ghi vào toàn bộ đĩa và đo theo khoảng thời gian. Bạn chính xác ở chỗ điều này phụ thuộc vào một số yếu tố, nhưng điều này sẽ cung cấp cho ít nhất một xấp xỉ có thể sử dụng. –

+0

Cảm ơn Adam, nhưng tôi không cần bất cứ điều gì chính xác ... tỷ lệ tối đa lý thuyết được đề xuất bởi Jonathan là tốt. – Sheridan

1

Hãy thử sử dụng WMI api, cũng LINQ to WMI có thể hữu ích.

+0

Cảm ơn các liên kết ... Tôi đã đánh dấu chúng. :) – Sheridan

1

Tôi không biết cách nào để có được tốc độ truyền dữ liệu tối đa của HD, nhưng với WMI bạn có thể lấy được mặt phẳng của đĩa cứng (USB, IDE ...). Bạn có thể sử dụng tốc độ truyền dữ liệu tối đa của giao diện và tăng tỷ lệ phần trăm cho nó.

Ngoài ra, tôi sẽ để lại một liên kết ở đây đến một bài viết nhỏ về lấy thông tin frm HD bằng WMI, với mã nguồn. LINK

+0

Cảm ơn, điều này nghe có vẻ như những gì tôi đang sau. Cảm ơn cũng cho các liên kết, nhưng nếu bạn đang nói về lớp Win32_LogicalDisk, tôi đã không tìm thấy các lĩnh vực phù hợp/thuộc tính cung cấp thông tin đó ... bạn sẽ xảy ra để biết điều đó? – Sheridan

+1

Tôi nghĩ InterfaceType của nó - http://msdn.microsoft.com/en-us/library/aa394132 (VS.85).aspx Đây là một ví dụ: http://www.geekpedia.com/tutorial73_An-introduction-in -retrieving-WMI-in-Csharp.html – SwDevMan81

+0

Cảm ơn SwDevMan81, tôi sẽ cho nó đi. – Sheridan