2019-11-29-dotnet-判断特定进程存在方法
| 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-判断特定进程存在方法的更多相关文章
- 2019-9-23-dotnet-判断特定进程存在方法
title author date CreateTime categories dotnet 判断特定进程存在方法 lindexi 2019-09-23 16:20:42 +0800 2019-09- ...
- 2019.11.29 Mysql的数据操作
为名为name的表增加数据(插入所有字段) insert into name values(1,‘张三’,‘男’,20); 为名为name的表增加数据(插入部分字段) insert into name ...
- 2019.11.29 SAP SMTP郵件服務器配置 發送端 QQ郵箱
今天群裏的小夥伴問了如何配置郵件的問題,隨自己在sap裏面配置了一個 1. RZ10配置參數 a) 参数配置前,先导入激活版本 执行完毕后返回 b) 输入参数文件DEFAU ...
- pycharm+anaconda在Mac上的配置方法 2019.11.29
内心os: 听人说,写blog是加分项,那他就不是浪费时间的事儿了呗 毕竟自己菜还是留下来东西来自己欣赏吧 Mac小电脑上进行python数据开发环境的配置 首先下载Anaconda,一个超好用的数据 ...
- Supervision meeting notes 2019/11/29
topic 分支: 1. subgraph/subsequence mining Wang Jin, routine behavior/ motif. Philippe Fournier Viger ...
- 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( ...
- [转帖]判断Linux进程在哪个CPU核运行的方法
判断Linux进程在哪个CPU核运行的方法 原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问 ...
- C++ 获取特定进程的CPU使用率<转>
C++ 获取特定进程的CPU使用率 近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况 ...
- windows下使用C#获取特定进程网络流量
最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...
随机推荐
- ctf活动结果
签到题:flag{0ca175b9c0f726831d895e269332461} 解题过程:使用winhex打开图片,查询到ANSI ASCII 得到结果 1.SimCTF{hello simple ...
- extentsreport testng美化报告生成
一:主要内容 优化testng测试报告,使用extentsreport 解决extentsreport打开后加载不出来样式的问题 二:报告效果 先上图,看下testng extentsreport报告 ...
- ES6 变量的结构赋值用途(实用技巧)
1.交换变量的值 let x=1; let y=2; [x,y]=[y,x];//x=2,y=1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里返回,有了解构 ...
- SAEJ1757-1-2015(一)
SURFACE VEHICLE STANDARD 表面车辆标准 Standard Metrology for Vehicular Displays 车载显示 ...
- [Flask]使用sqlite数据库
app.py from flask import Flask from flask_sqlalchemy import SQLAlchemy import os basedir = os.path.a ...
- 【flask】表单-上传文件
依赖: flask-wtf upload_case.html <!DOCTYPE html> <html lang="en"> <head> & ...
- LeetCode.953-验证外语字典顺序(Verifying an Alien Dictionary)
这是悦乐书的第364次更新,第392篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第226题(顺位题号是953).在外语中,令人惊讶的是,他们也使用英文小写字母,但可能使 ...
- nginx配置laravel项目
在/etc/nginx/conf.d下新建一个laravel.conf文件,并编辑 写入如下文件即可 server { listen 80; server_name xxx; root "/ ...
- CF The World Is Just a Programming Task (Easy Version)【分析·思维】
题目传送门 题意: 给定一个括号序列,随意交换两个位置的括号之后,问有多少个不同长度的圈.关于圈的定义大概就是:将括号序列的后$k$个数放到括号序列的最前面,就是长度为$k$的圈.(看了好久题意emm ...
- javascript 数据类型之数值转换
数值转换 一.有3个函数可以把非数值转换为数值: Number() parse Int() parse Float() 说明: 1.Number()可以用于任何数据类型,强转类型,如果不能把指转成数值 ...