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);
        }
    }
}

 

相关文章
|
8月前
|
设计模式 小程序 API
小程序之页面通信&派发通知
小程序之页面通信&派发通知
|
4月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
154 7
[虚幻引擎插件介绍] DTGlobalEvent 蓝图全局事件, Actor, UMG 相互回调,自由回调通知事件函数,支持自定义参数。
本插件可以在虚幻的蓝图 Actor, Obiect,UMG 里面指定绑定和执行消息,可带自定义参数。 参数支持 Bool,Byte,Int,Int64,Float,Name,String,Text,Vector,Rotator,Transform,Object,Actor。
100 0
|
数据采集 监控 NoSQL
一日一技:Python多线程的事件监控
一日一技:Python多线程的事件监控
172 0
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
1230 0
activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便
|
安全 C++ Windows
C++调用外部应用程序的方法的整理总结(常用)
一、三个SDK函数:  WinExec,ShellExecute ,CreateProcess可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。
3044 0
在线程异步的场合下,如何将线程信息传递到调用处(2)
在线程异步的场合下,如何将线程信息传递到调用处
158 0
|
存储 Java 程序员
在线程异步的场合下,如何将线程信息传递到调用处(1)
在线程异步的场合下,如何将线程信息传递到调用处
133 0
|
小程序
小程序 事件
 什么是事件 事件是视图层到逻辑层的通讯方式。 事件可以将用户的行为反馈到逻辑层进行处理。 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。 事件对象可以携带额外信息,如 id, dataset, touches。
949 0

相关实验场景

更多