C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用
关于进程
之前我在启动我的师生对讲的exe的时候,都是直接调用Process类的静态函数Process.Start(System.String AppPath,System.String Arguments) 来直接启动一个exe,这样当然是可以的,但是当我们的进程退出或者意外崩溃的时候,却没有办法对这个进程进行相关的检测,也就是说如果进程中途退出了的话,可能会导致整个框架的互斥等状态未发生改变,这个时候就需要用到一个进程对象
也就是说我们可以先实例化一个进程的对象Process p_VideoMeet,然后再用这个进程p_VideoMeet来表示我们整个运行着的进程,也就不用再做一些没什么含义的启动检测啊,状态码之类的东西了。所以对于此,我在这里写一个相关的实例。
比如我现在一个类,LBD_VideoMeet类,我可能在这个类内启动两个进程之中的一个,之前我们在使用的时候,是直接通过Process.Start这个静态函数启动,然后记录其启动的状态,其实这样的调用容易导致一些混乱的状态,而且有可能程序的意外退出,如果崩溃的话就没法知道当前的进程状态了,没有通知的情况,会导致无法获得互斥状态,如果这样的话,就没法清除当前状态了。
那么现在来上实例。
假设我们现在可以获得两个程序,Intercom.exe和 Broadcast.exe的启动路径和启动参数,而且当我们启动的时候就会向我们的框架中发送句柄,那我们现在应该怎么做呢?
首先我们当然是希望打开的子进程不脱离我们的主进程,也就是我们在主进程中可以有完整的子进程,所以不能像野狗拉屎一样,把子进程拉出来放在大街上随风而去就完了(当然考虑到高内聚低耦合的原则,这肯定是最好的状态,打开的子进程有完整独立的功能,而需要整合其中的程序用dll来表示,但是开发中难免有些妥协,比如开源,或者跨语言的程序,或者像我这样的新手写dll没法保证内存和线程的安全性)
那我们就用一个进程来表示我们现在需要启动的进程 Process p_VideoMeet,因为Intercom和Broadcast是互斥的,所以两个共享一个进程类就行了,反正这个进程退出的时候也会释放掉所有的资源,所以不需要操心。甚至这样操作可以省去很多不必要的判别,直接释放进程类资源即可。
原先没有参悟到这个精髓写出来的大便现在再回过头来看真是令人羞愧,但是能跑告诉公路的大便,谁在乎他会不会有轮子呢?
我们先设置一个进程对象
Process p_VideoMeet = null;
启动进程的方法:
public void StartProcess(System.String strAppPath, System.String Argus)
{
try
{
if(this.p_VideoMeet == null)
{
p_VideoMeet = new Process();
}
p_VideoMeet.StartInfo.FileName = strAppPath; //启动进程具体路径
p_VideoMeet.StartInfo.Arguments = Argus; //启动项参数
p_VideoMeet.StartInfo.UseShellExecute = false;//是否使用操作系统shell启动
p_VideoMeet.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
p_VideoMeet.StartInfo.RedirectStandardOutput = false;//由调用程序获取输出信息
p_VideoMeet.StartInfo.RedirectStandardError = true;//重定向标准错误输出
p_VideoMeet.StartInfo.CreateNoWindow = false;//不显示程序窗口
p_VideoMeet.EnableRaisingEvents = true;
//意外退出的话,我这边也可以得到消息了
p_VideoMeet.Exited += this.P_Exited;
p_VideoMeet.Start();
}
catch (Exception e)
{
WriteErrorMessage("CheckClientExitMessages:" + e.Message);
}
}
意外退出事件
public static event EventHandler ExitedEvent;
private static void P_Exited(object sender, EventArgs e)
{
if (ExitedEvent!=null)
{
ExitedEvent(sender,e);
}
}
最伟大的设计,就是最简单的设计。
关于事件和委托
其实我个人在开发过程中是比较抵触事件和委托这个叫法的,就有点像socket通讯里管socket叫套接字 这种翻译一样,即使到了我还是觉得所谓的套接字没有 发包 这两个字来的简介明了。
如果要换一种说法,我们要怎么理解呢?其实就像是触发器和接收器 -- 当我们按下触发器之后,所有的接收器都会接到触发器发送来的信号。打个比方,就好像烽火狼烟,我一点火,所有的哨站就知道开干了,这种情况下烽火只能传递一个简单信号:起火等于开干,但是这也是只有其他哨所才懂其中的含义;或者海上的灯塔,按照一定的频率和强度打信号,海上的渔船就能看得懂灯塔打来的信号,这样传递的信息就更加复杂了,这些传递的信息也只有这个海域的渔船们才会懂,不同的海域可能会有不同的约定俗成的信号模式。

C#的事件委托大致和我上面说的这两种模型差不多,都分为 1.触发器,即发送信号的方法 2.接收器,即接收到信号并触发行为的方法
之前我也有些过一篇博客,有关于事件和委托相关的内容的,详情见下方博客
C#中的进程检测退出事件和座位状态改变事件深入浅出谈谈EventHandler的使用的更多相关文章
- iOS:使用代理模式监听开关状态改变事件
记一次解决跨控制器监听开关状态改变的尝试. 为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell.SettingCell ...
- JS事件 文本框内容改变事件(onchange)通过改变文本框的内容来触发onchange事件,同时执行被调用的程序。
文本框内容改变事件(onchange) 通过改变文本框的内容来触发onchange事件,同时执行被调用的程序. 如下代码,当用户将文本框内的文字改变后,弹出对话框"您改变了文本内容!&quo ...
- jQuery中的bind绑定事件与文本框改变事件的临时解决方法
暂时没有想到什么好的解决办法,我现在加了个浏览器判断非ie的话就注册blur事件,这样有个问题就是blur实在别的控件活动焦点的时候,txtStation控件注册的方法是为了填充它紧挨着的一个下拉列表 ...
- JS监听input框的回车事件、属性值改变事件
一.介绍 在程序猿门的工作中,经常会遇见一些表单数据的提交,对于有表单的东西而言,input输入框是非常常见的,所以对于一些input的基本事件,我们需要去掌握 二.input的监听enter事件 比 ...
- HTML5事件—visibilitychange 页面可见性改变事件
转:https://blog.csdn.net/yusirxiaer/article/details/73480916 又看到一个很有意思的HTML5事件 visibilitychange事件是浏览器 ...
- 是什么在.NET程序关闭时阻碍进程的退出?
在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...
- linux进程解析--进程的退出及销毁
一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...
- linux系统中的进程状态分析
转载地址:https://blog.csdn.net/shenwansangz/article/details/51981459 linux是一个多用户,多任务的系统,可以同时运行多个用户的多个程序, ...
- silverlight属性改变事件通知
工作中遇到silverlight本身没有提供的某些属性改变事件,但又需要在属性改变时得到通知,Google搬运stack overflow,原地址 /// Listen for change of t ...
- 1.2 Linux中的进程 --- fork、vfork、exec函数族、进程退出方式、守护进程等分析
fork和vfork分析: 在fork还没有实现copy on write之前,Unix设计者很关心fork之后立即执行exec所造成的地址空间浪费,也就是拷贝进程地址空间时的效率问题,所以引入vfo ...
随机推荐
- prometheus设置使用密码nginx反向代理访问
注意: 1.设置访问密码的方式 2.ngixn反向代理的配置 # 安装 Apache工具包 apt install apache2-utils htpasswd -bc /etc/nginx/.pro ...
- Spring mvc源码分析系列--Servlet的前世今生
Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...
- 关于AWS-EC2或者多个资源的tag的批量添加-基于Resource Groups & Tag Editor 和 命令处理
今天收到一个请求,需要对公司所有的ec2-添加上两个成本IO标签,因为机器太多了 想到了如下两种方案去批量处理 方案一:利用aws的 [Management Tools]下的 Resource Gro ...
- SpringMVC访问不到默认页的问题。
在web.xml中配置了 <welcome-file-list> <welcome-file>index.html</welcome-file> </welc ...
- 【Java8新特性】- Optional应用
Java8新特性 - Optional应用 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! ...
- Linux中CentOS 7的安装及Linux常用命令
1. 前言 什么是Linux Linux是一套免费使用和自由传播的操作系统.说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天所学习的Linux也是一款操作系统. 为什么 ...
- wpf下的图片放大缩小
WPF下实现图片的放大缩小移动 在windows 7里面有自带的图片查看器,这个软件可以打开一张图片然后以鼠标在图片中的焦点为原点来进行缩放,并且放大后可以随意拖动.下面我们在WPF中实现这个功能 ...
- 二、Celery执行一步任务
二.Celery执行异步任务 2.1.基本使用 创建项目celerypro 创建异步任务执行文件celery_task: import celery import time backend='redi ...
- Typora图床上传配置:PicGo+Gitee 不完全指南
每次写Markdown都要手动传图,再复制链接到Typora里,这样比较繁琐. 设置好图床,搭配PicGo,写作时直接剪贴图片到Typora,就能实现自动上传,这样就方便很多. Gitee配置: 许多 ...
- java学习之spring基础
0x00前言 spring框架应用的是ioc模式,ioc模式是指控制反转模式,本质是你不去创建对象让spring框架给你创建对象你去使用对象.多种开发模式通过配置文件和注解的方式去开发的都很值得去学习 ...