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. 开源EDR(OSSEC)基础篇- 02 -部署环境与安装方式

    https://yq.aliyun.com/articles/683077?spm=a2c4e.11163080.searchblog.9.753c2ec1lRj02l

  2. 问题:unknown error: call function result missing 'value' 解决方法

    问题:unknown error: call function result missing 'value' 页面也没有 填充信息 原因是:安装与chrome和对应的chromedriver版本问题 ...

  3. 从txt导入数据到mysql

    当要往mysql的table中录入数据量大的时候,直接从txt录入已有数据是一个愉快的选择. 在录入数据前要做一些格式上的准备 1. txt编码要是utf-8,无BOM 2. 每行以\t\n结尾,每列 ...

  4. Ruby小白入门笔记之<Rubymine工具的快捷键>

    智能快捷 Ctrl+Alt+G:弹出Generate Ctrl+Alt+L:格式化代码 Alt+F1:切换视图(Project, Structure, etc.). Alt+F2:弹出预览窗口,可选择 ...

  5. Selenium 2自动化测试实战17(警告框处理)

    一.警告框处理 在WebDriver中处理JavaScript所生成的alert.confirm以及prompt十分简单,只需要使用switch_to_alert()方法定位到alert/confir ...

  6. ALV SCRIPTFROM 内容比较全的一个例子

    REPORT  ZQM_PRT04. *----------------------------------------------------------------------* * TABLES ...

  7. 【myeclipse2014-2017】使用相关

    1.窗口背景颜色修改 2.javascript代码块背景颜色修改 3.控制台颜色相关 4.myeclipse主题相关 5.myeclipse清除项目缓存 (1.删除work中的文件.2.删除wabap ...

  8. 从MAP角度理解神经网络训练过程中的正则化

    在前面的文章中,已经介绍了从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化,本次我们从最大后验概率点估计(MAP,maximum a posteriori point estimate)的 ...

  9. 【VS开发】在VS2010中开发ActiveX控件设置测试容器的方式

    在VS2010中开发ActiveX控件设置测试容器的方式 借鉴文章http://blog.csdn.net/waxgourd0/article/details/7374669 在VS2010中开发MF ...

  10. Linux学习笔记(14)linux在6.x和7.x系列的安装与基本使用区别

    关键词,centos7 centos6.x安装与使用:https://www.cnblogs.com/gered/p/9440551.html centos7.x安装与使用(本文)转自:https:/ ...