Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 监视同名进程,我做错了什么_C#_Process_Cpu Usage_Performancecounter - Fatal编程技术网

C# 监视同名进程,我做错了什么

C# 监视同名进程,我做错了什么,c#,process,cpu-usage,performancecounter,C#,Process,Cpu Usage,Performancecounter,我正在制作一个测试WinForm应用程序,以尝试和监视具有相同名称的进程。但出于某种原因,它不起作用 但我表格上的标签保持为零 表单的全局变量: Thread checkProcess; List<PerformanceCounter> pcs; 线程检查过程; 列出个人电脑; 单击启动监视过程的按钮 private void btnMonitor_Click(object sender, EventArgs e) { List<Process> proc =

我正在制作一个测试WinForm应用程序,以尝试和监视具有相同名称的进程。但出于某种原因,它不起作用

但我表格上的标签保持为零

表单的全局变量:

Thread checkProcess;
List<PerformanceCounter> pcs;
线程检查过程;
列出个人电脑;
单击启动监视过程的按钮

private void btnMonitor_Click(object sender, EventArgs e)
{
    List<Process> proc = new List<Process>();
    foreach (Process p in Process.GetProcesses())
    {
        if (p.ProcessName.IndexOf(txtProcessName.Text) > -1)
        {
            proc.Add(p);
        }
    }
    pcs = new List<PerformanceCounter>();
    int k = 0;
    foreach (Process p in proc)
    {
        pcs.Add(new PerformanceCounter("Process", "% Processor Time", k > 0 ?
            string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName, true));
        lstbxPC.Items.Add(k > 0 ?
            string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
        k++;
    }
    checkProcess = new Thread(CheckProcess);
    checkProcess.Start();
}
private void btnMonitor\u单击(对象发送方,事件参数e)
{
List proc=新列表();
foreach(Process.getprocesss()中的进程p)
{
if(p.ProcessName.IndexOf(txtProcessName.Text)>-1)
{
程序添加(p);
}
}
pcs=新列表();
int k=0;
foreach(进程中的进程p)
{
pcs.Add(新性能计数器(“进程”,处理器时间百分比),k>0?
Format(“{0}{1}”,p.ProcessName,k):p.ProcessName,true);
lstbxPC.Items.Add(k>0?
格式(“{0}{1}”,p.ProcessName,k):p.ProcessName);
k++;
}
checkProcess=新线程(checkProcess);
checkProcess.Start();
}
监视和更新标签的方法(在其自己的线程中启动):

private void CheckProcess()
{
    int temp = 0;
    while (true)
    {
        temp = 0;
        foreach (PerformanceCounter pc in pcs)
        {
            if (temp < pc.NextValue())
            {
                temp = (int)pc.NextValue();
            }

        }
        // Set the label in a ThreadSafe way. This does work
        SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
        Thread.Sleep(1000);
    }
}
private void CheckProcess()
{
内部温度=0;
while(true)
{
温度=0;
foreach(pc中的PerformanceCounter pc)
{
如果(温度
有很多东西需要检查:

  • 您的
    PC
    是否有物品?(调试)
  • txtProcessName
    中的文本是什么?(模式是
    {processname without exe}{nb}
    ,比如devenv#1、devenv#2、…)
  • 您能读取性能计数器吗?(检查安全性)
  • 因为您正在将NextValue()强制转换为int,所以不会看到任何小于1%的更改
您还应该更改代码,因为如果进程停止,您将得到一个异常(计数器类别中缺少实例)。

请尝试此选项以了解大小:

    private void btnMonitor_Click(object sender, EventArgs e)
    {
        var proc = Process.GetProcesses().Where(p => p.ProcessName.IndexOf(this.txtProcessName.Text) > -1);
        var k = 1;
        var appendSuffix = proc.Count() > 1;

        this.pcs = new List<PerformanceCounter>();
        foreach (var p in proc)
        {
            this.pcs.Add(new PerformanceCounter(
                "Process",
                "% Processor Time",
                appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName,
                true));
            this.lstbxPC.Items.Add(appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
            k++;
        }

        this.checkProcess = new Thread(this.CheckProcess);
        this.checkProcess.Start();
    }

    private void CheckProcess()
    {
        while (true)
        {
            var temp = 0;

            foreach (var pc in this.pcs)
            {
                var nextValue = pc.NextValue();

                if (temp < nextValue)
                {
                    temp = (int)nextValue;
                }
            }

            // Set the label in a ThreadSafe way. This does work.
            SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
            Thread.Sleep(1000);
        }
    }
private void btnMonitor\u单击(对象发送方,事件参数e)
{
var proc=Process.GetProcesses()。其中(p=>p.ProcessName.IndexOf(this.txtProcessName.Text)>-1);
var k=1;
var appendSuffix=proc.Count()>1;
this.pcs=新列表();
foreach(过程中的var p)
{
此.pcs.Add(新性能计数器(
“过程”,
“%Processor Time”,
appendSuffix?string.Format(“{0}{1}”,p.ProcessName,k):p.ProcessName,
是的);
this.lstbxPC.Items.Add(appendSuffix?string.Format(“{0}{1}”,p.ProcessName,k):p.ProcessName);
k++;
}
this.checkProcess=新线程(this.checkProcess);
这个.checkProcess.Start();
}
私有无效检查进程()
{
while(true)
{
var-temp=0;
foreach(此.pcs中的var pc)
{
var nextValue=pc.nextValue();
如果(温度<下一个值)
{
temp=(int)下一个值;
}
}
//以线程安全的方式设置标签。这确实有效。
SetControlPropertyThreadSafe(lblCPU,“文本”,Convert.ToString(temp)+“%”;
睡眠(1000);
}
}

不要连续调用pc.NextValue()两次,每秒只调用一次。我真不敢相信我没有看到这一点!很可能是它不起作用的原因。你是对的,如果进程停止,我应该处理。请在
私有void CheckProcess()中尝试捕获
方法。捕获后,只需从列表中删除进程停止的
PerformanceCounter
。应该可以做到这一点。我喜欢您获取进程的方式。我从哪里可以了解更多如何使用这样的代码?这就是所谓的LINQ(语言集成查询)。下面是一个页面,其中包含一些代码示例,您可以用来开始学习: