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 ...
随机推荐
- 【前端必会】webpack的目标代码
背景 webpack生成什么样的代码呢?同的模块依赖的写法(import.export export default),会导致生成代码的不同,下面介绍普通的import与export 开始 导出PI1 ...
- bilibili弹幕爬虫
import random import requests import jieba import numpy as np from lxml import etree class SpiderBil ...
- 自定义ListView下拉刷新上拉加载更多
自定义ListView下拉刷新上拉加载更多 自定义RecyclerView下拉刷新上拉加载更多 Listview现在用的很少了,基本都是使用Recycleview,但是不得不说Listview具有划时 ...
- Goland Socket 服务
客户端发送消息 并接收服务端消息 package main import ( "fmt" "net" ) func main() { // conn, err ...
- Hive之安装
Hive安装 1. 依赖hadoop(另有hadoop安装文档) 执行程序运行在yarn上面,需要启动start-yarn.sh 2. 先安装MySQL MySQL安装详见数据库MySQL之安装:ht ...
- `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java
<jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...
- 齐博x1 APP要实现直播的关键两步
大家务必要注意,缺少这两步,你的APP将不能实现直播, 也即点击直播按钮无法启动直播推流
- AT24C02
AT24C02是一款拥有256bytes(32Page)的EEPROM. 一 :特点(部分) 1:双线接口: 2:双向数据传输协议: 3:400KHz波特率: 4:硬件写保护: 5:最大5ms写入同步 ...
- 深度优先搜索(Depth-First-Search)dfs代码模板
void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据需求添加 return; } if(越界或者是不合法状态) return; if(特殊状态)//剪枝,去除一些不需 ...
- 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...