需求:web页面读取系统进程信息,可以结束进程
实现:
方法一:一个方法是用Process.GetProcesses();结合linq查询进程的一些信息 var modelList = Process.GetProcesses();
        rptItems.DataSource = from c in modelList
                              orderby c.PrivateMemorySize64 descending
                              where c.Id!=curren.Id
                              select new { 
                                  c.Id, 
                                  c.ProcessName, 
                                  c.Threads.Count, 
                                  FileName=c.MainModule.FileName,//用它就报错
                                  PrivateMemorySize64 = (c.PrivateMemorySize64) / 1024
                              };
        rptItems.DataBind();
方法二:因为用MainModule.FileName时报错,我想用WMI方式ManagementObjectSearcher QS = new ManagementObjectSearcher(new SelectQuery("Win32_Process"));问题:1
第一个方法中,当我用了FileName=c.MainModule.FileName,报错:仅完成部分ReadProcessMemory 或WriteProcessMemory 请求,没遇见过这个错误,对进程不是很理解,怎么解决这类错误?
问题:2方法一和方法二哪个好一点?为什么呢?

解决方案 »

  1.   

    第一个方法也可以,最好加上try catch,可能有的进程权限不足或者别的问题。 var modelList = Process.GetProcesses(); 
            rptItems.DataSource = (from c in modelList 
                                  orderby c.PrivateMemorySize64 descending 
                                  where c.Id!=curren.Id 
                                  select c).Select(c => {
                                  string filename = "";
                                  try { filename = c.MainModule.FileName; } catch { }
                                  return new {  
                                      c.Id,  
                                      c.ProcessName,  
                                      c.Threads.Count,  
                                      FileName= filename,//用它就报错 
                                      PrivateMemorySize64 = (c.PrivateMemorySize64) / 1024 
                                  };}); 
            rptItems.DataBind();};
      

  2.   

    WMI的方法要好一点。WMI是微软帮你封装了一套查询监控的服务,比直接调用地层API更安全,性能能更稳定。