c# - System.Management 资源监控统计信息,如 I/O、CPU、内存使用...等'

标签 c# asp.net ajax winapi wmi-query

我正在尝试对本地数据库管理系统进行一些基准测试。 我需要想出一个 GUI 来显示类似

的信息
  • 每个核心的cpu使用情况
  • 内存使用情况
  • 硬盘输入/输出
  • ..等

它将使用 Vb.net,但如果需要我可以使用 p/invoke 或 native 代码

以下代码是:据我所知

Set objCimv2 = GetObject("winmgmts:root\cimv2")
Set objRefresher = CreateObject("WbemScripting.SWbemRefresher")

' Add items to the SWbemRefresher
' Without the SWbemRefreshableItem.ObjectSet call,
' the script will fail
Set objMemory = objRefresher.AddEnum _
    (objCimv2, _ 
    "Win32_PerfFormattedData_PerfOS_Memory").ObjectSet
Set objDiskQueue = objRefresher.AddEnum _
    (objCimv2, _
    "Win32_PerfFormattedData_PerfDisk_LogicalDisk").ObjectSet
Set objQueueLength = objRefresher.AddEnum _
    (objCimv2, _
    "Win32_PerfFormattedData_PerfNet_ServerWorkQueues").ObjectSet

' Initial refresh needed to get baseline values
objRefresher.Refresh
intTotalHealth = 0
' Do three refreshes to get data
For i = 1 to 3
    WScript.Echo "Refresh " & i
    For each intAvailableBytes in objMemory
        WScript.Echo "Available megabytes of memory: " _
            & intAvailableBytes.AvailableMBytes
        If intAvailableBytes.AvailableMBytes < 4 Then
            intTotalHealth = intTotalHealth + 1
        End If
    Next
    For each intDiskQueue in objDiskQueue
        WScript.Echo "Current disk queue length " & "Name: " _
            & intDiskQueue.Name & ":" _
            & intDiskQueue.CurrentDiskQueueLength
        If intDiskQueue.CurrentDiskQueueLength > 2 Then
            intTotalHealth = intTotalHealth + 1
        End If
    Next
    For each intServerQueueLength in objQueueLength
        WScript.Echo "Server work queue length: " _
            & intServerQueueLength.QueueLength
        If intServerQueueLength.QueueLength > 4 Then
            intTotalHealth = intTotalHealth + 1                       
        End If
    Wscript.Echo "  "
    Next
    If intTotalHealth > 0 Then
        Wscript.Echo "Unhealthy."
    Else
        Wscript.Echo "Healthy."
    End If
    intTotalHealth = 0
    Wscript.Sleep 5000
' Refresh data for all objects in the collection
    objRefresher.Refresh
Next

我正在寻找一个很好的 API 来使用 C#、asp.net webforms、framework 4.0 - 4.02 访问实时硬件(当前版本是 windows 7 x64)信息和统计数据。 目前我所知道的是如何操作和访问“进程”,但不按照本文的要求进行绑定(bind)。

最佳答案

public class MyPerfoamnceCounter
{

    public string pc()
    {
        Dictionary<string, List<PerformanceCounter>> counters =

    new Dictionary<string, List<PerformanceCounter>>();
        List<PerformanceCounter> cpuList = new List<PerformanceCounter>();
        List<PerformanceCounter> procList = new List<PerformanceCounter>();
        List<PerformanceCounter> memList = new List<PerformanceCounter>();

        PerformanceCounterCategory perfCat = new PerformanceCounterCategory();
    foreach (Process process in Process.GetProcesses()) 
    {


        PerformanceCounter procProcesTimeCounter  = new PerformanceCounter(
         "Process", 
        "% Processor Time", 
        process.ProcessName);
        var proc = procProcesTimeCounter; procList.Add(proc);
        procProcesTimeCounter.NextValue(); 


        PerformanceCounter procCPUTimeCounter = new PerformanceCounter(
         "Processor",
        "% Processor Time",
        process.ProcessName);
         //procCPUTimeCounter.CategoryName= "Processor";
         perfCat.CategoryName = procCPUTimeCounter.CategoryName;
         var ex = PerformanceCounterCategory.Exists("Processor");

         if (ex)
         {
             cpuList.Add(procCPUTimeCounter);
             //if(procCPUTimeCounter.InstanceName
             //if(procCPUTimeCounter.InstanceName == process.ProcessName)
             procCPUTimeCounter.NextValue();
         }

        PerformanceCounter procMemTimeCounter = new PerformanceCounter(
             "Memory", "Available MBytes",
            process.ProcessName);
        ex = perfCat.InstanceExists(process.ProcessName);


        if (ex)
        {
            var mem = procMemTimeCounter; memList.Add(mem);
            procMemTimeCounter.NextValue();
        }

        /*
         var oktoplot = Convert.ToUInt32(v) != 0;
            if (oktoplot)
                counters.Add(procProcesTimeCounter);
        */
    }

    counters.Add("CPUs", cpuList);
    counters.Add("PROCs", procList);
    counters.Add("MEMs", memList);

    System.Threading.Thread.Sleep(2250); // 1 second wait  ("Memory", "Available MBytes")


    StringBuilder SbRw = new StringBuilder();
    SbRw.Append("<table id = 'tblMainCounters'>");
    List<string> couterNames = new List<string>();
    foreach (string cName in counters.Keys)
    {
        couterNames.Add(cName);
    }

    foreach (string cNameStr in couterNames)
    {

        SbRw.Append("\r\n\t<tr>\r\n\t\t<td>\r\n\t\t\t<table id='tbl" + cNameStr + "'>\r\n\t\t\t\t");
        for (int i = 0; i < counters[cNameStr].Count; i++)
        {
            //string ToPRint = counters[cNameStr].ElementAt(i).NextValue().ToString();
            //bool OkToprint = string.IsNullOrEmpty(ToPRint) == false && ToPRint != (0.0).ToString() && ToPRint != (0).ToString();
            //if (OkToprint)
            SbRw.Append(string.Format("\r\n\t\t\t\t\t<tr id='{0}List{1}'>\r\n\t\t\t\t\t\t<td>Category : </td><td>{2}</td><td> Process : </td><td>{3}</td><td> CounterName : </td><td>{4}</td><td> CPU Usage : </td><td><b> {5}%</b></td>\r\n\t\t\t\t\t</tr>",
            cNameStr,
            i.ToString(),
            counters[cNameStr].ElementAt(i).CategoryName,
            counters[cNameStr].ElementAt(i).InstanceName,
            counters[cNameStr].ElementAt(i).CounterName,
            counters[cNameStr].ElementAt(i).NextValue()));

        }
        SbRw.Append("</table><!-- Closing table_" + cNameStr + " -->\r\n\t\t\t</td>\r\n\t\t</tr>");
    }
    SbRw.Append("</table><!-- Closing tableMainCounters --><br /><br />");

    return(SbRw.ToString()); 


}

JQuery Ajax 部分用于在不刷新的情况下更新我正在使用的页面

$('document').ready(function () {
    // alert("JeuryIsOnline");
    $('#DivRobCounterRes').fadeTo(4, 0);

    $('.Span_imgMemeBase').click(
        function () {

            var Spars = [];
            Spars.push("egnition");

            for (i = 1; i < 11; i++)

            jQuerySendCfrm(Spars);
     });


});    // EndJquery Ready Code 



function jQuerySendCfrm(resluts) {

    var SentClientinfo = []
    SentClientinfo.push({ key: "SentClientinfo", value: resluts });
    var CurrpageURL = "default.aspx/";
    var WebmethodName = "StartTest";
    var StageIdentifyer = "stage1";
    var Post_TargetUrl = CurrpageURL + WebmethodName;

    jQueryAajaxNoPostBack(Post_TargetUrl, SentClientinfo, StageIdentifyer);
}


function jQueryAajaxNoPostBack(targetUrl, passedSentPars, StageIdentifyer) {
//////////    alert(JSON.stringify({ SentPars: passedSentPars }));
    $.ajax({
        type: 'POST',
        url: targetUrl,
        data: JSON.stringify({ SentPars: passedSentPars }),

        contentType: "application/json; charset=utf-8",
        dataType: "json",

        success: function (response) {
            if (StageIdentifyer == "stage1") {
                var htmlret = response.d;
                getCallBackToGenerateSeYaMsg(htmlret);
            }
//            else if (StageIdentifyer == "stage2") {
//                var html4TableHeaders = response.d;
//                getCallBackToGenerateInnerHtmlDiv(html4TableHeaders);
//                //alert(response.d)
//            }

    },
    error: function (response) {
    ////////            alert(response.status + ' ' + response.statusText);

           }
    });
}

function getCallBackToGenerateSeYaMsg(html) {

            $('#DivRobCounterRes').fadeTo(400, 1);
            $('#DivRobCounterRes').append(html);
}

MSDN Using Process

MSDN2

stack overflow post链接

关于c# - System.Management 资源监控统计信息,如 I/O、CPU、内存使用...等',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17139705/

相关文章:

ASP.NET - 创建自定义上下文对象?

c# - ASP.NET 中的多选下拉列表

c# - VisualStateManager 似乎无法在 UserControl 的 ControlTemplate 中工作

c# - 发布后应用设置

c# - 当页面处于非事件状态一段时间后,单击事件不会触发

c# - word文档,如何在asp.net应用程序中正确编辑

java - Tomcat 和 Servlet 问题

javascript - find() ajax 响应的值(HTML)?(javascript)

asp.net - 将 JSON 对象传递给 Web 方法

c# - Xamarin Forms 和 Prism Navigation 历史记录