Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.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# - Fatal编程技术网

C# 有没有更好的方法来确定是否从给定文件启动了任何正在运行的进程?

C# 有没有更好的方法来确定是否从给定文件启动了任何正在运行的进程?,c#,C#,我必须仅根据EXE文件的名称来检查是否有另一个进程正在运行 当前,我获取进程列表,然后查询MainModule.FileName属性,但是当您访问MainModule属性时,有些进程抛出Win32Exception“无法枚举进程模块”。 目前,我正在通过捕获这些访问异常过滤到“安全列表”,因此: List<Process> processes = new List<Process>(Process.GetProcesses()); // Slow, but failsa

我必须仅根据EXE文件的名称来检查是否有另一个进程正在运行

当前,我获取进程列表,然后查询
MainModule.FileName
属性,但是当您访问
MainModule
属性时,有些进程抛出
Win32Exception
“无法枚举进程模块”。 目前,我正在通过捕获这些访问异常过滤到“安全列表”,因此:

List<Process> processes = new List<Process>(Process.GetProcesses());

// Slow, but failsafe.  As we are dealing with core system
// data which we cannot filter easily, we have to use the absense of
// exceptions as a logic flow control.
List<Process> safeProcesses = new List<Process>();
foreach (Process p in processes)
{
    try
    {
        ProcessModule pm = p.MainModule;
        // Some system processes (like System and Idle)
        // will throw an exception when accessing the main module.
        // So if we got this far, we can add to the safe list
        safeProcesses.Add(p);
    }
    catch { } // Exception for logic flow only.
}
List processs=新列表(Process.getprocesss());
//速度慢,但故障安全。因为我们正在处理核心系统
//我们无法轻易过滤的数据,我们不得不使用缺少
//作为逻辑流控件的异常。
List safeprocesss=new List();
foreach(进程中的进程p)
{
尝试
{
ProcessModule pm=p.main模块;
//一些系统进程(如系统进程和空闲进程)
//访问主模块时将引发异常。
//所以如果我们走到这一步,我们可以把它添加到安全列表中
添加(p);
}
catch{}//仅用于逻辑流的异常。
}
不用说,我真的不喜欢使用这样的异常

是否有更好的方法来获取进程列表,以便访问
MainModule
属性,或者有更好的方法来检查是否有任何进程是从给定文件生成的?

我将使用like

        List<Process> processes = Process.GetProcesses().ToList();
        List<Process> safeProcesses  = processes .Select(X => 
        {
            try {  ProcessModule  pp = X.MainModule; return X; }

            catch { return null; }
        }).Where(X=>X!=null).ToList();
List processs=Process.getprocesss().ToList();
列出安全进程=进程。选择(X=>
{
请尝试{ProcessModule pp=X.MainModule;返回X;}
catch{return null;}
}).Where(X=>X!=null).ToList();

我认为只有系统进程和空闲进程会抛出异常,因此您可以在之前过滤掉它们,然后就可以开始了。

基本上是相同的技术(捕获异常),但包装在Linq中,而不是foreach循环。我真的在寻找一种不使用异常的方法。实际上,我给了你一个+1的注释,因为知道如何在linq中实现这一点很有用,但这不是我想要的答案(我不想使用异常)。是的,正如在访问
进程的
模块
属性时提到的,当:您试图访问系统进程或空闲进程的Modules属性时,将引发Win32异常。这些流程没有模块。谢谢-我的第一个版本就是这样做的,但我不确定是否还有其他版本(我一定错过了MSDN库中的那句话,因为我读了整页两遍!)。