title author date CreateTime categories
dotnet 判断特定进程存在方法
lindexi
2019-11-29 08:34:18 +0800
2019-09-23 16:20:41 +0800
dotnet

本文告诉大家几个方法判断特定的进程是否存在,同时对比这些方法的性能

使用锁判断

在 C# 中判断一个进程存在的方法,如果这个进程是自己创建的,可以通过 Mutex 的方法,通过创建一个锁,然后在其他进程判断这个锁是否存在。这使用到内核的方法,性能不错

假设需要判断进程 HacurbonefeciloQicejewarrerai 是否存在,而这个进程是自己写的进程,那么可以在这个进程的主函数创建一个锁请看代码

    class Program
{
static void Main(string[] args)
{
var mutex = new Mutex(true, Const.Lock, out var createdNew); if (!createdNew)
{
Console.WriteLine("已经有进程启动");
} Console.ReadKey(); mutex.Dispose();
}
} public static class Const
{
public const string Lock = "5742D257-CCCC-4F7A-2191-6362609C452D";
}

在另一个进程可以使用下面方法判断进程是否已经存在

        public bool FindExistByMutex()
{
return Mutex.TryOpenExisting(Const.Lock, out var result);
}

在使用 Mutex 如果没有传入 Name 那么将会在一个进程内,使用相同对象的锁,做到同步。如果给了命名,将会调用内核,在所有进程同步

使用锁判断进程存在将需要小心这些问题 .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv

使用进程名判断

另一个方法是通过进程名判断,这样判断的进程就不需要是自己写的进程,通过进程名判断是获取对应进程名的进程,通过判断返回数组元素,请看代码

        public bool FindExistByProcessName()
{
var name = "HacurbonefeciloQicejewarrerai";
return Process.GetProcessesByName(name).Length > 0;
}

上面代码的 name 传入需要判断的进程

在使用进程名判断的时候,可选的方法还有通过 Process.GetProcesses() 然后判断里面的进程名,但是使用上面方法的性能是最高的

使用 Process 判断进程是否存在的方法性能请看 .NET 中 GetProcess 相关方法的性能 - walterlv

现在已经告诉大家两个方法判断进程是否存在,通过内核方式判断的性能比较快,请看下面性能

两个方法性能

使用标准性能测试 测试了两个方法的性能,可以看到使用内核的方式的性能很快

BenchmarkDotNet=v0.11.5, OS=Windows 10.0.18362
Intel Core i7-6700 CPU 3.40GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.4010.0
DefaultJob : .NET Framework 4.7.2 (CLR 4.0.30319.42000), 64bit RyuJIT-v4.8.4010.0
Method Mean Error StdDev
FindExistByProcessName 6,955.411 us 197.9235 us 580.4753 us
FindNotExistByProcessName 6,552.935 us 198.3320 us 271.4790 us
FindExistByMutex 3.032 us 0.0908 us 0.2649 us
FindNotExistByMutex 2.064 us 0.0412 us 0.0521 us

测试代码请看下面

    public class Program
{
static void Main(string[] args)
{
BenchmarkRunner.Run<Program>();
} [Benchmark]
public bool FindExistByProcessName()
{
var name = "HacurbonefeciloQicejewarrerai";
return Process.GetProcessesByName(name).Length > 0;
} [Benchmark]
public bool FindNotExistByProcessName()
{
return Process.GetProcessesByName("不存在的进程").Length > 0;
} [Benchmark]
public bool FindExistByMutex()
{
return Mutex.TryOpenExisting(Const.Lock, out var result);
} [Benchmark]
public bool FindNotExistByMutex()
{
return Mutex.TryOpenExisting("不存在的进程", out var result);
}
}

在运行测试代码之前先使用下面代码测试判断进程存在

        static void Main(string[] args)
{
Process.Start("HacurbonefeciloQicejewarrerai.exe"); var program = new Program(); Console.WriteLine($"FindExistByProcessName={program.FindExistByProcessName()}");
Console.WriteLine($"FindNotExistByProcessName={program.FindNotExistByProcessName()}");
Console.WriteLine($"FindExistByMutex={program.FindExistByMutex()}");
Console.WriteLine($"FindNotExistByMutex={program.FindNotExistByMutex()}");
}

代码放在 github 欢迎下载

2019-11-29-dotnet-判断特定进程存在方法的更多相关文章

  1. 2019-9-23-dotnet-判断特定进程存在方法

    title author date CreateTime categories dotnet 判断特定进程存在方法 lindexi 2019-09-23 16:20:42 +0800 2019-09- ...

  2. 2019.11.29 Mysql的数据操作

    为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...

  3. 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱

    今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1.    RZ10配置參數 a)       参数配置前,先导入激活版本 执行完毕后返回 b)      输入参数文件DEFAU ...

  4. pycharm+anaconda在Mac上的配置方法 2019.11.29

    内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...

  5. Supervision meeting notes 2019/11/29

    topic 分支:  1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...

  6. EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)

    传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...

  7. [转帖]判断Linux进程在哪个CPU核运行的方法

    判断Linux进程在哪个CPU核运行的方法   原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问 ...

  8. C++ 获取特定进程的CPU使用率<转>

    C++ 获取特定进程的CPU使用率 近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况 ...

  9. windows下使用C#获取特定进程网络流量

    最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...

随机推荐

  1. 第六周学习总结&第四次实验报告

    第六周学习总结&第四次实验报告 学习总结 这周我们简单的学习了一点点关于接口的内容,接口是Java中最重要的概念之一,接口可以理解为一个特殊的类, 里面由全局常量和公共的抽象方法组成,接口摆脱 ...

  2. echart 饼图图例legend支持滑动

    ps: 以下针对option操作 文章目录 图例过多加上滚动条图例形状图例自定义显示图例过多加上滚动条 legend:{ top:'50', bottom:'50', type:'scroll',} ...

  3. Python学习笔记:外部数据的输入、存储等操作

    查看current工作路径: >>> import os >>> os.getcwd() 'D:\\python' 更改工作路径: >>> os. ...

  4. java 正则表达式:有丶东西

    非常详细 原文地址:https://blog.csdn.net/jeffleo/article/details/52194977

  5. docker top 和 docker exec ps 命令查看的PID区别

    区别在于 docker top 查看到的 PID 属于宿主机的 PID.我们可以通过  宿主机执行 ps -ef 查看结果 也可以进去容器执行 top 和 ps查看结果

  6. 搭建jenkins集群node结点

    配置结点 首先,需要在jenkins的系统设置中新增一个结点 系统管理 -> 节点管理 -> New Node 配置Remote root directory最好和主jenkins的路径一 ...

  7. C#规范整理·多线程\异步\并行\任务

    有一个领域的工作处理起来几乎总是最棘手的,这就是多线程编码.多线程编码是所有开发人员前进途中的一个坎,现在,该是尝试克服它的时候了. 1.区分异步和多线程应用场景 先看一个例子 private voi ...

  8. squid 3.5.2配置文件

    https://www.cnblogs.com/mchina/p/3812190.html 配置文件就加入下面这几句话: cache_mem 64 MB maximum_object_size 4 M ...

  9. Python+requests+excel接口测试

    2018-06-14   17:00:13 环境准备: - Python 3.7 - requests库 - xlrd 1.创建Excel文件 2.读取Excel文件 import xlrd clas ...

  10. java:(设置编码集,密码的加密,JSTL,EL表达式,权限设置)

    1.设置编码集: package cn.zzsxt.lee.web.sevlet; import java.io.IOException; import javax.servlet.ServletEx ...