c#咋判断一个程序运行后关闭
CreateProcess之后也可以WaitForSingleObject,C#的Process类应该也有一样的做法,直接卡在哪里就好了,简直不需要操心。当然这样就浪费了一个线程,显得有点愚蠢,你再bing一下很快就能找到转await的方法。
■网友
【c#咋判断一个程序运行后关闭】 这个需求有两种情况:
一。监控已经在运行的程序
二。由你的程序运行一个程序然后监控
先说第二种情况,这在.Net里很好实现,因为基础库提供了该功能,并且没有@易天 说的那样复杂,思路其实与轮子哥说的一样,参考:Process.Exited Event 前提条件是设置EnableRaisingEvents 为true即可。
至于第一种情况,也分如下几类:
一。无权限的
二。已经设置EnableRaisingEvents属性的
三。未设置EnableRaisingEvents属性的
从这三种情况来看,无权限的你就不要想了。已经设置的,直接订阅退出事件就好,未设置的,设置了再订阅,设置失败的,你就不用想了。
另:sysinternals的procexp工具可以看到每个进程的运行情况,不知道那是怎么实现的,对Windows机制不太熟,不了解。
■网友
轮子哥不是已经说了么。如果用C#写界面的话一定绕不开线程和进程,所以你先看看多线程这一块吧。打好基础就很简单了,套两个Task,第一个阻塞,第二个等第一个完了之后就知道程序已经结束了。private void Button_Click(object sender, RoutedEventArgs e) { var inputString = InputBox.Text; if (string.IsNullOrWhiteSpace(inputString)) { return; } var words = inputString.Split(\u0026#39; \u0026#39;); var processName = words; var processArgs = string.Join(" ", words.Skip(1)); Task.Run(() =\u0026gt; { var process = Process.Start(processName, processArgs); process.WaitForExit(); return process.ExitCode; }).ContinueWith(result =\u0026gt; { MessageBox.Show("程序已停止","程序已停止"); }); }当然如果你需要操作界面的话上面的方法就不行了,因为对界面组件的调用都必须在图形界面的线程中做。如果在上面的任务中调用了界面的组件的话,就抛出异常了。这时候点击函数就必须声明为异步await的。比方说我现在要判断程序的结束码,如果是0(正常结束),就把主界面染成绿色;如果非正常结束,就染成红色。所以这部分代码必须通怪异步调用,放到点击函数里面,不能放到其他地方。
当然其实可以不用异步,把点击函数阻塞了也行。不过这时候你的程序就卡死了,鼠标会一直转圈,直到外部程序结束为止。所以我们顺带明白了,那些动不动就卡死的程序,多线程一定没做好,把有些阻塞操作放到主线程中了。private async void Button_Click(object sender, RoutedEventArgs e) { var inputString = InputBox.Text; if (string.IsNullOrWhiteSpace(inputString)) { return; } var words = inputString.Split(\u0026#39; \u0026#39;); var processName = words; var processArgs = string.Join(" ", words.Skip(1)); var exitCode = await Task.Run(() =\u0026gt; { var process = Process.Start(processName, processArgs); process.WaitForExit(); return process.ExitCode; }); if (exitCode == 0) { ParentGrid.Background = Brushes.LawnGreen; } else { ParentGrid.Background = Brushes.Red; } }
推荐阅读
- 同比■同比增长7.1%!2021年的第一个节你花了多少钱?
- “他是我第一个会说普通话的老师”:一对师生折射青海山村蝶变
- 有必要重新开个C店吗
- 招聘都要学历,何来程序员不看学历
- 银行系统的研发岗(程序员)是不是很难进(校招)推广到国企的研发岗(程序员)呢
- 大学再有三个月就结束了,没学到知识,参加一个软件测试培训机构好吗
- 汽车|长安UNI-K又将开创一个新的"引力"纪元?
- 神话|武汉传奇父亲:一个平行班孩子创造的高考神话(感动上万家长)
- 坐标合肥,请问在哪里能捕捉到程序员这种生物他们大都出现在哪里呢
- 王者荣耀李白能不能出肉
