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 ...
随机推荐
- 1. Fluentd安装方法
Fluentd是一个跨平台的开源系统,支持在Linux(Redhat.Ubuntu.Debian).Windows平台上运行.MacOS呢?官方并没有明显指出,但是在安装说明中列出了通过Ruby Ge ...
- [题解] LOJ 3300 洛谷 P6620 [省选联考 2020 A 卷] 组合数问题 数学,第二类斯特林数,下降幂
题目 题目里要求的是: \[\sum_{k=0}^n f(k) \times X^k \times \binom nk \] 这里面出现了给定的多项式,还有组合数,这种题目的套路就是先把给定的普通多项 ...
- PHP全栈开发(八):CSS Ⅶ 表格 style
表格默认是没有边框的,因此,我们在设置表格格式的时候,首先要设置的是表格边框的样式,也就是 table{ border-style:solid; } 设置完表格表格的样式之后,可以设置表格边框的粗细程 ...
- 文件管理工具“三剑客” #Everything #SpaceSniffer #Clover
前言: 本文收集了我日常使用的三个文件管理工具: 文件搜索神器--Everything 磁盘文件占用分析工具--SpaceSniffer 文件资源管理器--Clover 下面我从工具解决的痛点和使用技 ...
- 如何去了解Spring
对于你想了解的技术 官方总是一个合适的选择 首先,我们所指的Spring 一般指的是Spring Framework,伴随着的时代的进步,Spring全家桶也逐渐完善起来 Spring 1.Why S ...
- Java登录专题-----创建用户(一)
Java登录专题-----创建用户(一) 我来填坑了 创建用户 入参 应该包括: 用户姓名,用户密码,用户手机号,用户所属机构 用户版本号,角色id 出参: 没有 数据结构: JavaBean ...
- SQL--插入单引号值
sql语句中插入单引号的值需要多写一个单引号进行转义 例如:插入一个值为student' name的值 update table set name='student'' name'
- kubelet忽然不可用
原因,有可能机器的cpu信息有变化(扩容或者缩容)解决办法: 删掉/opt/var/lib/kubelet目录下(或者/data/lib/kubelet)cpu_manager_state文件 然后m ...
- iptables入门到精通
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架&qu ...
- DevOps|乱谈开源社区、开源项目与企业内部开源
之前的一篇文章<从特拉斯辞职风波到研发效能中的荒唐事>中关于企业内源的内容在研发效能群内引起了大家的热烈讨论.有的小伙伴不同意,有的小伙伴非常不同意,我觉得这都是非常正常的反馈,话不说不透 ...