C# 为什么流程数量存在差异?

C# 为什么流程数量存在差异?,c#,vb.net,process,C#,Vb.net,Process,我试图在DataGridView中列出所有进程 当我调暗前两行并读取总进程数时,它可以是一个类似于191个总进程的数字。然而,将每个进程相加的循环最终得到的数字通常是总数的一半左右?我想可能有某种隐藏的逻辑,其中没有添加重复项,但一旦完成,确实会将一些重复项添加到列表中 有人能指出所有进程没有被添加到列表中的原因吗 代码如下: Dim intProcessesCount As Integer = Process.GetProcesses.Count Dim localAll As

我试图在DataGridView中列出所有进程

当我调暗前两行并读取总进程数时,它可以是一个类似于191个总进程的数字。然而,将每个进程相加的循环最终得到的数字通常是总数的一半左右?我想可能有某种隐藏的逻辑,其中没有添加重复项,但一旦完成,确实会将一些重复项添加到列表中

有人能指出所有进程没有被添加到列表中的原因吗

代码如下:

   Dim intProcessesCount As Integer = Process.GetProcesses.Count

   Dim localAll As Process() = Process.GetProcesses()

    Try

        For Each OneProcess As Process In localAll

            ' Extract the program's icon
            Dim ico As Icon = Icon.ExtractAssociatedIcon(OneProcess.MainModule.FileName)
            Dim pID = OneProcess.Id.ToString

            imgID = pID

            ImageList1.Images.Add(pID, ico)

            Dim row As String() = New String() { _
                OneProcess.ProcessName, _
                OneProcess.MainModule.FileVersionInfo.FileName}

            DataGridView1.Rows.Add(row)

        Next

    Catch ex As Exception
        Debug.Print("Error: " & ex.Message)
    End Try

    ttslStats.Text = "Total Processes: " & DataGridView1.Rows.Count

您在输出窗口中看到的异常会中断for循环,因为try/catch包含整个for循环。因此,您只会得到出现在localAll中的进程,而不是导致异常的进程

如果在循环中移动try/catch,它将继续通过localAll,因此您应该得到原始数字减去异常数:

    For Each OneProcess As Process In localAll

      Try
        ' Extract the program's icon
        Dim ico As Icon = Icon.ExtractAssociatedIcon(OneProcess.MainModule.FileName)
        Dim pID = OneProcess.Id.ToString

        imgID = pID

        ImageList1.Images.Add(pID, ico)

        Dim row As String() = New String() { _
            OneProcess.ProcessName, _
            OneProcess.MainModule.FileVersionInfo.FileName}

        DataGridView1.Rows.Add(row)

     Catch ex As Exception
       Debug.Print("Error: " & ex.Message)
     End Try
    Next
此外,每次调用GetProcesses时,您都会得到一个新的进程列表,因此如果在两次调用之间启动了任何新进程或某些现有进程已退出,则第二次调用可能会返回不同数量的进程

您应该调用GetProcesses一次,立即将结果分配给localAll,然后使用该结果获取计数:

Dim localAll As Process() = Process.GetProcesses()

Dim intProcessesCount As Integer = localAll.Count

请注意,有一种方法可以让代码跳过为每个进程添加一行。检查您的调试。打印输出。我在输出窗口中得到了这个结果,但只有一次:System.dll中出现了“System.ComponentModel.Win32Exception”类型的第一次意外异常错误:访问被拒绝无论我是否以管理员身份运行IDE都会发生。ahhh。你总是忽略了一些简单的事情,哈哈。现在我已经做了,它又抛出了大约8个异常,再加上几个:System.dll中出现了“System.ComponentModel.Win32Exception”类型的第一次异常错误:无法枚举进程模块。知道为什么吗?看起来,即使代码现在将几乎所有这些元素都添加到了列表中,它仍然存在缺陷,因为它仍然没有添加其中的几个元素。关于对GetProcess的2个调用,我只是在调试时将intProcessCount插入其中:@J.ScottElblein Win32Exception太宽。你能从中得到结果代码和堆栈跟踪吗?根据堆栈跟踪,它们似乎都是由于这一行:Dim ico As Icon=Icon.ExtractAssociatedICONeProcess.MainModule.FileName该行仍然包含太多的方法,无法给出准确的答案。你能告诉我堆栈跟踪中第一个和最后一个方法的名称吗?还有一个导致异常的文件名。没关系,我想我找到这个后发现了原因。Q/A:谢谢你的帮助!