Задать вопрос
@awil00

Как лучше реализовать обновление данных о процессах, используя winforms c#?

Мне нужно сделать что-то наподобие диспетчера задач. Поначалу всё было замечально, пока не начал собирать информацию о нагрузке цп и видеокарты. В итоге решил, что буду использовать powershell, чтобы узнать нагрузку на видеокарту:
function GetProcessInfo {
    $lang = ([CultureInfo]::InstalleduICulture).Name
    if ($lang -match "ru-") { $cpucounter = '\процесс(*)\% загруженности процессора' }
    else { $cpucounter = '\process(*)\% processor time' }

    $allProcesses = (Get-Counter $cpucounter -ErrorAction SilentlyContinue).CounterSamples | Sort CookedValue -Descending                                     

    $results = @()

    foreach ($process in $allProcesses) {
        $processName = $process.InstanceName
        $pidi = (Get-Process -Name $processName).Id
        $username = (Get-Process -Name $processName -IncludeUserName).UserName
        $p = Get-Process -id $pidi
        $temp = 0
        $gpu = ((Get-Counter "\GPU Engine(pid_$($p.id)*engtype_3D)\Utilization Percentage").CounterSamples | where CookedValue).CookedValue
        foreach ($p in $gpu) {
            $temp = [math]::Round($p, 2)
        }
        [pscustomobject]@{
            ProcessName = $processName
            PID = $pidi
            CPU = [math]::Round(($process.CookedValue / ($allProcesses.CookedValue)[0] * 100), 2)
            User = $username
            GPU = [math]::Round($temp, 2)
        }
    }

    $results
}
GetProcessInfo

Но этот код выполняется очень долго. Чтобы обновить список процессов со всей информацией о них, нужно секунд 20.
А ещё же нужно обновлять этот список раз в секунду, желательно.
Подскажите, пожалуйста, как оптимизировать программу?
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы