2019-9-23-dotnet-判断特定进程存在方法
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
dotnet 判断特定进程存在方法
|
lindexi
|
2019-09-23 16:20:42 +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-9-23-dotnet-判断特定进程存在方法的更多相关文章
- 2019-11-29-dotnet-判断特定进程存在方法
title author date CreateTime categories dotnet 判断特定进程存在方法 lindexi 2019-11-29 08:34:18 +0800 2019-09- ...
- C++ 获取特定进程的CPU使用率<转>
C++ 获取特定进程的CPU使用率 近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况 ...
- [转帖]判断Linux进程在哪个CPU核运行的方法
判断Linux进程在哪个CPU核运行的方法 原文网址:http://www.embeddedlinux.org.cn/html/xinshourumen/201601/30-5013.html 问 ...
- windows下使用C#获取特定进程网络流量
最近老板接了一个中船重工的项目,需要做一个有关海军软件系统的组件评估项目,项目中有一个子项目需要获取特定进程的各种系统参数,项目使用.NET平台.在获取特定进程各种系统参数时,其它诸如进程ID,进程名 ...
- zabbix 监控特定进程
因为一些server上跑着一些重要程序,须要对它们进行监控,公司用的是zabbix监控,之前都是在zabbix中加入自己定义脚本对特定程序进行监控,近期看了zabbix的官方文档,发现原来强大的zab ...
- 使用python调用shell判断当前进程是否存在
使用subprocess模块判断当前进程是否存在 #! /usr/bin/env python import subprocess res = subprocess.Popen(r'ps -ef |g ...
- C#获取特定进程CPU和内存使用率
首先是获取特定进程对象,可以使用Process.GetProcesses()方法来获取系统中运行的所有进程,或者使用Process.GetCurrentProcess()方法来获取当前程序所对应的进程 ...
- Linux下实现脚本监测特定进程占用内存情况
Linux系统下,我们可以利用以下命令来获取特定进程的运行情况: cat /proc/$PID/status 其中PID是具体的进程号,这个命令打印出/proc/特定进程/status文件的内容,信息 ...
- Beta冲刺(2/7)——2019.5.23
所属课程 软件工程1916|W(福州大学) 作业要求 Beta冲刺(2/7)--2019.5.23 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪万里 ...
随机推荐
- MyBatis框架的文件配置
第一步:log4j.properties的配置 原因:Mybatis的日志输出是依赖与log4j的,所以必须要配置 # Global logging configuration log4j.rootL ...
- Blow up the city
Blow up the city 时间限制: 1 Sec 内存限制: 128 MB 题目描述 Country A and B are at war. Country A needs to organ ...
- MySQL双机热备份配置
双机热备份,即能够把主数据库中所有的数据同时写到备份的数据库中,从而实现MySQL数据库的热备份. MySQL Replication是MySQL提供的一种主从备份的机制,并且整个复制备份过程是异步进 ...
- Javascript-简单的欢迎cookie
0<!DOCT0000YPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml&quo ...
- [Array]485. Max Consecutive Ones
Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Input: [1, ...
- 直接删除mysql的日志导致mysql无法启动
--02T08::.750000Z [Warning] [MY-] [Server] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION ...
- maven下载安装以及环境配置
1.到官网下载maven 2.解压到自己想放的安装目录 3.复制maven所在的安装路径,然后右键我的电脑-->属性-->高级系统设置-->环境变量 4.在系统变量中新建,设置变量名 ...
- 2019-7-3-WPF-使用-Composition-API-做高性能渲染
title author date CreateTime categories WPF 使用 Composition API 做高性能渲染 lindexi 2019-07-03 10:30:57 +0 ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
- Leetcode17.Letter Combinations of a Phone Number电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" 输出:[&quo ...