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

 更新时间:2022年06月27日 10:17:52   作者:黑夜中的潜行者  
本文主要介绍了C# 守护进程的介绍及实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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# 守护进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 理解C#中的枚举(简明易懂)

    理解C#中的枚举(简明易懂)

    这篇文章主要介绍了理解C#中的枚举(简明易懂),本文讲解了枚举的优点、枚举说明、枚举的类型、枚举的使用建议等内容,需要的朋友可以参考下
    2015-05-05
  • 图解如何使用C#创建Windows服务

    图解如何使用C#创建Windows服务

    本文主要介绍了图解如何使用C#创建Windows服务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 如何在C#项目中链接一个文件夹下的所有文件详解

    如何在C#项目中链接一个文件夹下的所有文件详解

    很多时候我们需要获取一个结构未知的文件夹下所有的文件或是指定类型的所有文件,下面这篇文章主要给大家介绍了关于如何在C#项目中链接一个文件夹下的所有文件,需要的朋友可以参考下
    2023-02-02
  • C#使用Task实现异步方法

    C#使用Task实现异步方法

    本文主要介绍了C#使用Task实现异步方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C#异步编程Task的创建方式

    C#异步编程Task的创建方式

    这篇文章介绍了C#异步编程Task的创建方式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • 使用接口实现多继承的方法

    使用接口实现多继承的方法

    下面小编就为大家分享一篇c#使用接口实现多继承的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 基于C#实现语音识别功能详解

    基于C#实现语音识别功能详解

    在.NET4.0中,可以借助System.Speech组件让电脑来识别我们的声音。本文将利用该组件实现语音识别功能,文中实现过程讲解详细,需要的可以参考一下
    2022-04-04
  • C# Winform实现截图工具的示例代码

    C# Winform实现截图工具的示例代码

    这篇文章主要为大家详细介绍了如何使用C# Winform制作一个简单的截图工具,从而实现截图功能,文中的示例代码讲解详细,有需要的可以参考下
    2024-02-02
  • C# WinForm自动更新程序之文件上传操作详解

    C# WinForm自动更新程序之文件上传操作详解

    这篇文章主要为大家详细介绍了C# WinForm自动更新程序中文件上传操作,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2022-10-10
  • c#生成站点地图(SiteMapPath)文件示例程序

    c#生成站点地图(SiteMapPath)文件示例程序

    这篇文章主要介绍了c#生成站点地图(SiteMapPath)文件的示例,大家参考使用
    2013-11-11

最新评论