C#通过“委托和事件”的方式实现进程监控并与“普通方式”对比-阿里云开发者社区

开发者社区> 天外归云> 正文

C#通过“委托和事件”的方式实现进程监控并与“普通方式”对比

简介: 今天重新学习了一下观察者模式,对我的思路产生了启发。进程监控程序之前写过几个,这回换一种思路,改用委托和事件来实现。我已经用序号将关键的几步标注,方便大家理顺思路。代码如下: using System; using System.
+关注继续查看

今天重新学习了一下观察者模式,对我的思路产生了启发。进程监控程序之前写过几个,这回换一种思路,改用委托和事件来实现。我已经用序号将关键的几步标注,方便大家理顺思路。代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProcessMonitor
{
    public partial class ProcessMonitorForm : Form
    {
        public ProcessMonitorForm()
        {
            InitializeComponent();
            //Add the processes into the combox.
            var processes = Process.GetProcesses();
            foreach (var process in processes)
            {
                processComboBox.Items.Add(process.ProcessName.ToString());
            }
        }
        //The method that starts the monitor.
        private void startButton_Click(object sender, EventArgs e)
        {
            //4.Register the monitor.
            ProcessExit += new ProcessMonitor(ProExit);
            //Start the check.
            CheckProcess();
        }
        //The mothod that checks the process.
        private void CheckProcess()
        {
            bool flag = true;
            do
            {
                var processes = Process.GetProcesses();
                int count = 0;
                foreach (var process in processes)
                {
                    if (string.Compare(process.ProcessName, processComboBox.Text, true) == 0)
                    {
                        count++;
                    }
                }
                if (count == 0)
                {
                    //5.The event appears.
                    ProcessExit(this, new EventArgs());
                    flag = false;
                }
            } while (flag);
        }
        //1.The delegate that monitor the process.
        public delegate void ProcessMonitor(object sender, EventArgs strEventArg);
        //2.The event that encapsulates the delegate.
        public event ProcessMonitor ProcessExit;
        //3.The method that the delegate calls.
        private void ProExit(object sender, EventArgs strEventArg)
        {
            MessageBox.Show("The target process has been dispeared.");
        }
    }
}

为了不长篇累牍,效果只是简单实现,实际工作中可以随便扩展(选择进程,点击Start按钮进行监控。):

目标程序消失后弹出提示:

再附上一个脱去委托和事件的版本,代码如下(实现效果相同):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProcessMonitor
{
    public partial class ProcessMonitorForm : Form
    {
        public ProcessMonitorForm()
        {
            InitializeComponent();
            //Add the processes into the combox.
            var processes = Process.GetProcesses();
            foreach (var process in processes)
            {
                processComboBox.Items.Add(process.ProcessName.ToString());
            }
        }
        //The method that starts the monitor.
        private void startButton_Click(object sender, EventArgs e)
        {
            //Start the check.
            CheckProcess();
        }
        //The mothod that checks the process.
        private void CheckProcess()
        {
            bool flag = true;
            do
            {
                var processes = Process.GetProcesses();
                int count = 0;
                foreach (var process in processes)
                {
                    if (string.Compare(process.ProcessName, processComboBox.Text, true) == 0)
                    {
                        count++;
                    }
                }
                if (count == 0)
                {
                    ProExit();
                    flag = false;
                }
            } while (flag);
        }
        private void ProExit()
        {
            MessageBox.Show("The target process has been dispeared.");
        }
    }
}

如果用Action内置委托类型来完成的话就更方便了,代码如下(已经用序号标注关键步骤):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProcessMonitor
{
    public partial class ProcessMonitorForm : Form
    {
        public ProcessMonitorForm()
        {
            InitializeComponent();
            //Add the processes into the combox.
            var processes = Process.GetProcesses();
            foreach (var process in processes)
            {
                processComboBox.Items.Add(process.ProcessName.ToString());
            }
        }
        //The method that starts the monitor.
        private void startButton_Click(object sender, EventArgs e)
        {
            //Start the check.
            CheckProcess();
        }
        //The mothod that checks the process.
        private void CheckProcess()
        {
            //1.Define the action.
            Action<string> processExit = s => MessageBox.Show(s);
            bool flag = true;
            do
            {
                var processes = Process.GetProcesses();
                int count = 0;
                foreach (var process in processes)
                {
                    if (string.Compare(process.ProcessName, processComboBox.Text, true) == 0)
                    {
                        count++;
                    }
                }
                if (count == 0)
                {
                    //2.Active the action.
                    processExit("The target process has been dispeared.");
                    flag = false;
                }
            } while (flag);
        }
    }
}

脱去委托和事件的版本代码量明显比用委托和事件的代码量少了,为什么我们还要选择用委托和事件来做这件事呢?到底什么情况下,更适合用委托和事件的方式来完成?书中说,委托可以提高方法扩展性,没错,是这样的,说白了就是因为更高级!个人意见哈,在代码量少,以后不需要扩展方法的情况下,用不着用委托和事件的方式去完成,直接调用方法就好了。如果我说错了,欢迎指正我。

利用C#6.0中的语法糖扩展方法来替代foreach循环,代码量将更少。代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ProcessMonitor
{
    public partial class ProcessMonitorForm : Form
    {
        public ProcessMonitorForm()
        {
            InitializeComponent();
            //Add the processes into the combox.
            var processes = Process.GetProcesses();
            foreach (var process in processes)
            {
                processComboBox.Items.Add(process.ProcessName.ToString());
            }
        }
        //The method that starts the monitor.
        private void startButton_Click(object sender, EventArgs e)
        {
            //Start the check.
            CheckProcess();
        }
        //The mothod that checks the process.
        private void CheckProcess()
        {
            //1.Define the action.
            Action<string> processExit = s => MessageBox.Show(s);
            bool flag = true;
            do
            {
                var processes = Process.GetProcesses();
                var countVar = processes.Where(i => i.ProcessName == processComboBox.Text);
                if (countVar.Count() == 0)
                {
                    //2.Active the action.
                    processExit("The target process has been dispeared.");
                    flag = false;
                }
            } while (flag);
        }
    }
}

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Kubenetes里pod和service绑定的实现方式
我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令kubectl run。 本文介绍另一种方式,通过这种方式来学习Kubernetes里pod和对应的service是如何绑定的。
2274 0
用C#写一个多进程监控自动关机工具
因为据说某server开着就很贵,所以我们跑完测试的job后就要赶紧关机才行,但是测试的job要跑很久,过程中又不需要干什么,所以就得有个守家的,有时候会走很晚。如果有一个自动化关机的工具就好了,当指定的进程结束了以后系统就会自动关机。
798 0
python os.startfile python实现双击运行程序 python监控windows程序 监控进程不在时重新启动
用python监控您的window服务 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://world77.blog.51cto.com/414605/782935     最近比较烦,研发给的pc服务版本在虚拟机上已经开始给客户使用了,服务老是莫名的死翘翘,客户不停的电话给我,搞的我心情很差,于是在一个下午,静下心来,用python写了个简单的监控进程的脚本,当发现进程消失的时候,立即调用服务,开启服务。
1614 0
并发服务器三种实现方式之进程、线程和select
这篇主要介绍如何实现并发服务器,主要通过三种方式:进程、线程和select函数来分别实现。
1419 0
温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
一、委托Delegate 一般的方法(Method)中,我们的参数总是string,int,DateTime...这些基本的数据类型(或者没有参数),比如 public void HelloWorld() {    Console.
540 0
C#中的委托和事件(续)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。
674 0
css点滴3—5种方式实现圆环
使用css实现圆环,最简单的方式就是使用嵌套标签,设置border-radius就可以实现,但是这个是最简单的方式,这篇文章我们介绍5种方式实现圆环。 1.两个标签嵌套 html代码: 1 css代码: .
867 0
css点滴2—六种方式实现元素水平居中
本文参考文章《六种方式实现元素水平居中》 元素水平居中的方法,最常见的莫过于给元素一个显式的宽度,然后加上margin的左右值为auto。这种方式给固定宽度的元素设置居中是最方便不过的。但是很多情况下,无法确定容器宽度,这里我们讨论一下这些问题。
1130 0
[C#]C#中委托和事件(续)
引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。
515 0
+关注
天外归云
测试开发工程师,目前就职于网易。
200
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载