Con la clase System.Diagnostics.PerformanceCounter
, conéctela al contador de PhysicalDisk relacionado con la unidad que está indexando.
A continuación se muestra un código para ilustrar, aunque actualmente está codificado de forma rígida para la unidad "C:". Deseará cambiar "C:" a la unidad que esté escaneando su proceso. (Este es un código de muestra aproximado solo para ilustrar la existencia de contadores de rendimiento; no lo tome como una información precisa) siempre debe usarse como guía. Cambie para su propio propósito)
Observe el % Tiempo de inactividad Contador que indica con qué frecuencia el disco está haciendo algo. 0% inactivo significa que el disco está ocupado, pero no significa necesariamente que sea plano y no pueda transferir más datos.
combinar los % Tiempo de inactividad con Current Disk Longitud de la cola y esto le dirá si la unidad está recibiendo tan ocupado que no puede dar servicio a todas las solicitudes de datos. Como regla general, cualquier valor superior a 0 significa que el disco probablemente esté ocupado y cualquier valor superior a 2 significa que el disco está completamente saturado. Estas reglas se aplican a SSD y HDD bastante bien.
Además, cualquier valor que lea es un valor instantáneo en un punto en el tiempo. Deberías hacer un promedio continuo de unos pocos resultados, p. realice una lectura cada 100 ms y promedie 5 lecturas antes de utilizar la información del resultado para tomar una decisión (es decir, esperar hasta que los contadores se resuelvan antes de realizar su próxima solicitud de autorización de ingreso).
internal DiskUsageMonitor(string driveName)
{
// Get a list of the counters and look for "C:"
var perfCategory = new PerformanceCounterCategory("PhysicalDisk");
string[] instanceNames = perfCategory.GetInstanceNames();
foreach (string name in instanceNames)
{
if (name.IndexOf("C:") > 0)
{
if (string.IsNullOrEmpty(driveName))
driveName = name;
}
}
_readBytesCounter = new PerformanceCounter("PhysicalDisk",
"Disk Read Bytes/sec",
driveName);
_writeBytesCounter = new PerformanceCounter("PhysicalDisk",
"Disk Write Bytes/sec",
driveName);
_diskQueueCounter = new PerformanceCounter("PhysicalDisk",
"Current Disk Queue Length",
driveName);
_idleCounter = new PerformanceCounter("PhysicalDisk",
"% Idle Time",
driveName);
InitTimer();
}
internal event DiskUsageResultHander DiskUsageResult;
private void InitTimer()
{
StopTimer();
_perfTimer = new Timer(_updateResolutionMillisecs);
_perfTimer.Elapsed += PerfTimerElapsed;
_perfTimer.Start();
}
private void PerfTimerElapsed(object sender, ElapsedEventArgs e)
{
float diskReads = _readBytesCounter.NextValue();
float diskWrites = _writeBytesCounter.NextValue();
float diskQueue = _diskQueueCounter.NextValue();
float idlePercent = _idleCounter.NextValue();
if (idlePercent > 100)
{
idlePercent = 100;
}
if (DiskUsageResult != null)
{
var stats = new DiskUsageStats
{
DriveName = _readBytesCounter.InstanceName,
DiskQueueLength = (int)diskQueue,
ReadBytesPerSec = (int)diskReads,
WriteBytesPerSec = (int)diskWrites,
DiskUsagePercent = 100 - (int)idlePercent
};
DiskUsageResult(stats);
}
}
¿El servicio tendrá privilegios administrativos o se ejecutará como una cuenta de usuario normal? (Los contadores de rendimiento para el disco físico requieren privilegios de administrador). Dependiendo de la respuesta, puede haber otra manera. –
Sí, tendrá privilegios de administrador. – Anatoly