广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C# 守护进程的介绍及实现详解
  • 406
分享到

C# 守护进程的介绍及实现详解

2024-04-02 19:04:59 406人浏览 安东尼
摘要

目录1、为什么需要守护进程2、守护进程有哪几种方式3、监听系统事件 和 WMI查询事件代码实现1) 系统事件监听进程的关闭2)WMI监听进程的启动和关闭1、为什么需要守护进程 一般是

1、为什么需要守护进程

一般是为了保护我们的程序/服务的正常运行,当程序被关闭、异常退出等时再次启动程序/恢复服务

2、守护进程有哪几种方式

常见的守护进程的方式:
1、轮询(轮询最简单也最low,这里不再作说明)
2、监听系统事件
3、WMI查询事件

3、监听系统事件 和 WMI查询事件代码实现

1) 系统事件监听进程的关闭

需要引入 System.Diagnostics namespace
原理便是通过订阅 Exited 事件
优点:代码简洁,逻辑清晰
缺点:无法监听进程的启动,且只能监听进程的正常退出,异常导致程序崩溃监听不到。

代码实现:

using System.Diagnostics;

var p = Process.GetProcessesByName("notepad")[0];
p.EnableRaisingEvents = true;
p.Exited += P_Exited;

Console.ReadLine();

void P_Exited(object? sender, EventArgs e)
{
    p = Process.Start("notepad");

    p.EnableRaisingEvents = true;
    p.Exited += P_Exited;
}

2)WMI监听进程的启动和关闭

WMI简介
windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系统的数据和操作的基础结构。

WMIC
是WMI的命令行管理工具
使用 WMIC,不但可以管理本地计算机,而且还可以管理同一Windows域内的所有远程计算机(需要必要的权限),而被管理的远程计算机不必是先安装WMIC,只需要支持WMI即可。WMIC有一个能搞分析、解释和执行从命令行接受的别名(Alias)的引擎,他是一个可执行文件,名为 WMIC.exe,这个文件通常位于 “C:\Windows\System32\wbem” 文件夹中(支持Windows XP和Windows2003及以后的系统)

命令行例子:wmic cpu get name 查看CPU信息

有需要深入研究的小伙伴可以去看看:WMI编程手册

代码实现:

说明:System.Management namespace
.net framework版本中默认存在,直接引入即可
.net core中需要NuGet安装 “System.Management” 包

using System.Management;

// 查询进程创建 1秒钟通知
var qCreate = new WqlEventQuery($"__InstanceCreationEvent", TimeSpan.FromSeconds(1), $"TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'Notepad.exe'");

// 查询进程关闭 1秒钟通知
var qDelete = new WqlEventQuery($"__InstanceDeletionEvent", TimeSpan.FromSeconds(1), $"TargetInstance isa \"Win32_Process\" and TargetInstance.Name = 'Notepad.exe'");

// 创建事件查询的监听器
ManagementEventWatcher wCreate = new ManagementEventWatcher(qCreate);
ManagementEventWatcher wDelete = new ManagementEventWatcher(qDelete);

// 注册事件
wCreate.EventArrived += (sender, e) =>
{
    Console.WriteLine($"进程启动:{GetInfo(e.NewEvent)}");
};

wDelete.EventArrived += (sender, e) =>
{
    Console.WriteLine($"进程关闭:{GetInfo(e.NewEvent)}");
};

// 开始监听
wCreate.Start();
wDelete.Start();
Console.ReadLine();

static string GetInfo(ManagementBaseObject obj)
{
    var instance = obj["TargetInstance"] as ManagementBaseObject;
    return $"{instance["Name"]}-{instance["ProcessId"]}";
}

为了简明思路代码中并没有是现在进程退出后重新启动,有需要可以使用前面的 Process.Start("notepad"); 实现重启

到此这篇关于C# 守护进程的介绍及实现详解的文章就介绍到这了,更多相关C# 守护进程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C# 守护进程的介绍及实现详解

本文链接: https://www.lsjlt.com/news/152725.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C# 守护进程的介绍及实现详解
    目录1、为什么需要守护进程2、守护进程有哪几种方式3、监听系统事件 和 WMI查询事件代码实现1) 系统事件监听进程的关闭2)WMI监听进程的启动和关闭1、为什么需要守护进程 一般是...
    99+
    2022-11-13
  • linux 守护进程详解及建立守护进程
    linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程。   守护进程的启动   要启动一个守护进程,可以采取一下几种方式: 在系统期间通过系统的初始化脚本启动...
    99+
    2022-06-04
    进程 详解 linux
  • C#守护进程如何实现
    今天小编给大家分享一下C#守护进程如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、为什么需要守护进程一般是为了保护...
    99+
    2023-07-02
  • C/C++中I/O进阶详解及其作用介绍
    目录概述I/O 类库I/O 中的重载流对象标准输入流cin 流对象案例get 函数getline 函数eof 函数cout 流对象cerr 流对象clog 流对象概述 C++ 的输入...
    99+
    2022-11-12
  • C++中友元的详解及其作用介绍
    目录概述友元普通的友元函数友元成员函数友元类总结概述 类的友元函数 (friend) 是定义在类外部, 但是有权限访问类的所有私有 (private) 成员和保护 (protecte...
    99+
    2022-11-12
  • C++中指针的详解及其作用介绍
    目录概述指向对象的指针指向对象数据成员的指针this 指针this 指针的作用this 指针的实现概述 指针 (pointer) 是一个变量, 其指为另一个变量的地址. 即内存位置的...
    99+
    2022-11-12
  • python中的daemon守护进程实现
    守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。 ...
    99+
    2023-01-31
    进程 python daemon
  • C++进程的创建和进程ID标识详细介绍
    目录进程的ID进程创建进程的ID 进程的ID,可称为PID。它是进程的唯一标识,类似于我们的身份证号是唯一标识,因为名字可能会和其他人相同,生日可能会与其他人相同…&h...
    99+
    2022-11-13
  • C/C++中二进制文件&顺序读写详解及其作用介绍
    目录概述二进制 vs ASCII二进制写入ASCII 写入read 和 write 读写二进制文件案例一案例二概述 二进制文件不同于文本文件, 它可以用于任何类型的文件 (包括文本文...
    99+
    2022-11-12
  • C++中static修饰符的详解及其作用介绍
    目录概述静态数据成员引用静态数据成员用类名访问数据成员静态成员函数综合案例概述 static (静态) 修饰符是用来控制变量的存储方式和可见性的. 静态局部变量存储在静态区域: s...
    99+
    2022-11-12
  • C++中const修饰符的详解及其作用介绍
    目录概述常对象常对象成员常成员函数常数据成员数据成员访问限制常对象修改的限制常指针指向常变量的指针指向对象的指针小结对象的常引用总结概述 const 是 constant 的缩写, ...
    99+
    2022-11-12
  • C++中对象与类的详解及其作用介绍
    目录什么是对象面向过程 vs 面向对象面向过程面向对象什么是类类的格式类的成员函数函数访问权限方法一方法二方法三inline 成员函数什么是对象 任何事物都是一个对象, 也就是传说中...
    99+
    2022-11-12
  • C/C++中文件的随机读写详解及其作用介绍
    目录概述随机读写函数例子指针流成员函数随机访问二进制数据概述 文件的操作方式分为顺序读写和随机读写. 顺序读写指文件的指针只能从头移到尾巴. 随机读写指文件指针可以随意移动, 根据需...
    99+
    2022-11-12
  • 详解Java模拟栈的实现以及Stack类的介绍
    目录1.用 Java 模拟栈1.1 栈是什么1.2 模拟栈1.3 汇总2.Stack 类的介绍2.1 Stack 的常用方法1.用 Java 模拟栈 1.1 栈是什么 栈是一种数据结...
    99+
    2023-05-17
    Java模拟实现栈 Java 栈 Java Stack
  • PHP实现守护进程的示例代码
    目录前言成为守护进程的步骤实现说明创建子进程并退出父进程创建新的会话重设文件掩码改变工作目录关闭标准输入输出其他注意事项前言 写 PHP CLI 程序的老司机们可能经常会写一些常驻进...
    99+
    2022-11-13
  • 关于C++STL string类的介绍及模拟实现
    目录一、标准库中的string类1.string类2.string类中的常用接口说明+模拟实现2.1 string类对象的常见构造+模拟实现 2.2 string类对象的容量操作+模...
    99+
    2022-11-12
  • python使用fork实现守护进程的方法
    os模块中的fork方法可以创建一个子进程。相当于克隆了父进程 os.fork() 子进程运行时,os.fork方法会返回0; 而父进程运行时,os.fork方法会返回子进程的PID号。 所以可以使用PI...
    99+
    2022-06-04
    进程 方法 python
  • C++中浅拷贝与深拷贝的详解及其作用介绍
    目录概述对象的赋值对象的复制对象复制的用途建立一个新对象函数的参数为类对象函数的返回值为类对象浅拷贝深拷贝概述 浅拷贝 (shallow copy) 只是对指针的拷贝, 拷贝够两个指...
    99+
    2022-11-12
  • C++中封装与信息隐藏的详解及其作用介绍
    目录概述类的公用接口类的私有实现方法与消息概述 封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念. 这样能避免受到外界干扰和误用. 数据隐藏包括数据封装和数据抽象两...
    99+
    2022-11-12
  • Python如何实现守护进程的方法示例
    场景设置: 你编写了一个python服务程序,并且在命令行下启动,而你的命令行会话又被终端所控制,python服务成了终端程序的一个子进程。因此如果你关闭了终端,这个命令行程序也会随之关闭。 要使你的py...
    99+
    2022-06-04
    示例 如何实现 进程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作