• 在写性能监视器的时候,程序报System.ComponentModel.Win32Exception错误


    应用原因:我做了一个C/S系统。很多客户端连接到服务器来进行数据上报的工作。但由于数据量的巨大,程序经常出现System.OutOfMemoryException的错误。
    接下来我要对IIS进行应用程序池的设置,同时也需要修改程序。这时我就想知道,在出现错误时,机器的各个进程的状态。比如当前的服务器有启用哪些进程,这些进程的内存占用为多少,W3WP占用的物理内存与虚拟内存为多少。
    于是我写了如下的应用程序代码:
    ....

    ArrayList al = GetCurrentProcess(iErrorID);
                    foreach (NoteErrProcessInfo pInfo in al)
                    {
                        WriteProcessInfoToDataBase(pInfo);
                    }


    /// <summary>
            /// 取得当前所有线程的信息数组
            /// </summary>
            /// <returns>线程信息数组 </returns>
            private static ArrayList GetCurrentProcess(int iErrorID)
            {
                ArrayList al = new ArrayList();
                Process[] MyProcesses = Process.GetProcesses();
                foreach (Process MyProcess in MyProcesses)
                {
                    if (MyProcess.ProcessName.ToUpper() != "IDLE")
                    {
                        al.Add(GetProcessInfo(iErrorID, MyProcess.Id));
                    }
                }
                return al;
            }


    /// <summary>
            /// 给线程信息类赋值
            /// </summary>
            /// <param name="iErrorID">错误行号 </param>
            /// <param name="iProcessID">线程ID值 </param>
            /// <returns> </returns>
            private static NoteErrProcessInfo GetProcessInfo(int iErrorID,int iProcessID)
            {
                NoteErrProcessInfo pInfo = new NoteErrProcessInfo();
                Process MyProcess = Process.GetProcessById(iProcessID);
                pInfo.ErrorID = iErrorID;
                pInfo.ProcessName = MyProcess.ProcessName;
                pInfo.ProcessId = MyProcess.Id.ToString();
                pInfo.ThreadsCount = MyProcess.Threads.Count.ToString();
                pInfo.CpuProcessorTime = MyProcess.TotalProcessorTime.ToString();
                pInfo.PriorityClass = MyProcess.PriorityClass.ToString();
                pInfo.StartTime = MyProcess.StartTime.ToLongTimeString();
                pInfo.PrivateMemorySize = (MyProcess.PrivateMemorySize64 / 1024).ToString() + "K";
                pInfo.PeakVirtualMemorySize = (MyProcess.PeakVirtualMemorySize64 / 1024).ToString() + "K";
                pInfo.PeakPagedMemorySize = (MyProcess.PeakPagedMemorySize64 / 1024).ToString() + "K";
                pInfo.PagedSystemMemorySize = (MyProcess.PagedSystemMemorySize64 / 1024).ToString() + "K";
                pInfo.PagedMemorySize = (MyProcess.PagedMemorySize64 / 1024).ToString() + "K";
                pInfo.NonpagedSystemMemorySize = (MyProcess.NonpagedSystemMemorySize64 / 1024).ToString() + "K";
                pInfo.WorkingMomory = (MyProcess.WorkingSet64 / 1024).ToString() + "K";
                pInfo.VirtualMemorySize = (MyProcess.VirtualMemorySize64 / 1024).ToString() + "K";
                return pInfo;
            }

    .......

    当出现应用程序错误的时候,把线程错误日志,以及线程性能日志,全部插入到数据库中去。

    问题描述:
    如果这份程序是winform程序,或者用F5进行调试。则没有任何问题。
    但如果放在ASP.NET+IIS站点中执行的时候,会报如下错误:

    MyProcess.TotalProcessorTime = “MyProcess.TotalProcessorTime”引发了“System.ComponentModel.Win32Exception”类型的异常。其中NativeErrorCode为5

    根据帮助,我查询了Win32 Error Codes
    具体参见:ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/debug/base/system_error_codes.htm
    发现错误描述为ERROR_ACCESS_DENIED 5 Access is denied.

    问题:
    我想知道,在ASP.NET + IIS 组成的站点中,想实现我这样的性能监视功能,我应该怎么进行IIS的设置?或者说,怎么该我的程序?
  • 相关阅读:
    Linux 基础与应用教程 003(权限管理命令简单基础)
    Linux 基础与应用教程 002
    Android:监听音键并屏蔽系统的音量调节
    Android:用Seekbar来调节屏幕亮度
    Android:获得一个竖的seekbar
    python之路(4)高阶函数和python内置函数
    python之路(3)函数和匿名函数
    python之路(2)集合(set)和字符串格式化
    python之路(1)数据类型
    SD从零开始03-04
  • 原文地址:https://www.cnblogs.com/captain_ccc/p/1517409.html
Copyright © 2020-2023  润新知