读取系统进程,用Process和WMI哪个好?
需求: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方法一和方法二哪个好一点?为什么呢?
[解决办法]
第一个方法也可以,最好加上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();};
[解决办法]
WMI的方法要好一点。WMI是微软帮你封装了一套查询监控的服务,比直接调用地层API更安全,性能能更稳定。