ZBLOG

上面代码测试发现关闭窗体后cmd命令没有被终止而是继续执行完了,代码上有其他更可靠的改动方案吗

在之前的代码中,终止 CMD 命令的逻辑可能存在一定问题,特别是在处理窗口关闭时。为了确保 CMD 进程能够可靠地被终止,我们可以使用 Process 类中的一些方法来更有效地管理子进程。以下是改进的版本:

改进代码示例

  1. using System;
  2. using System.Diagnostics;
  3. using System.Windows.Forms;
  4. namespace CmdExecutor
  5. {
  6. public partial class MainForm : Form
  7. {
  8. private Process cmdProcess;
  9. public MainForm()
  10. {
  11. InitializeComponent();
  12. }
  13. private void btnExecute_Click(object sender, EventArgs e)
  14. {
  15. ExecuteCommand("your_command_here"); // 替换成您想要执行的CMD命令
  16. }
  17. private void ExecuteCommand(string command)
  18. {
  19. cmdProcess = new Process();
  20. cmdProcess.StartInfo.FileName = "cmd.exe";
  21. cmdProcess.StartInfo.Arguments = "/C " + command; // /C 表示执行完命令后终止CMD
  22. cmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向输出流
  23. cmdProcess.StartInfo.UseShellExecute = false; // 不使用操作系统外壳启动进程
  24. cmdProcess.StartInfo.CreateNoWindow = true; // 不创建窗口
  25. cmdProcess.OutputDataReceived += CmdProcess_OutputDataReceived; // 添加事件处理器
  26. try
  27. {
  28. cmdProcess.Start(); // 启动进程
  29. cmdProcess.BeginOutputReadLine(); // 开始异步读取输出
  30. }
  31. catch (Exception ex)
  32. {
  33. MessageBox.Show($"启动命令失败: {ex.Message}");
  34. }
  35. }
  36. private void CmdProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
  37. {
  38. if (!string.IsNullOrEmpty(e.Data))
  39. {
  40. AppendTextToTextBox(e.Data);
  41. }
  42. }
  43. private void AppendTextToTextBox(string text)
  44. {
  45. if (textBoxOutput.InvokeRequired)
  46. {
  47. textBoxOutput.Invoke(new Action<string>(AppendTextToTextBox), text);
  48. return;
  49. }
  50. textBoxOutput.AppendText(text + Environment.NewLine);
  51. textBoxOutput.ScrollToCaret(); // 滚动到文本框底部以查看最新输出
  52. }
  53. protected override void OnFormClosing(FormClosingEventArgs e)
  54. {
  55. base.OnFormClosing(e);
  56. if (cmdProcess != null && !cmdProcess.HasExited)
  57. {
  58. var result = MessageBox.Show("正在执行CMD命令,确认要关闭吗?", "确认", MessageBoxButtons.YesNo);
  59. if (result == DialogResult.Yes)
  60. {
  61. try
  62. {
  63. cmdProcess.Kill(); // 终止进程
  64. cmdProcess.WaitForExit(); // 等待进程完全退出,确保释放资源
  65. cmdProcess.Dispose(); // 释放资源
  66. }
  67. catch (Exception ex)
  68. {
  69. MessageBox.Show($"无法终止进程: {ex.Message}");
  70. }
  71. }
  72. else
  73. {
  74. e.Cancel = true; // 取消关闭操作
  75. }
  76. }
  77. }
  78. }
  79. }

改动点解释:

  1. 使用 WaitForExit():在调用 Kill() 后,我们添加了 WaitForExit() 方法,这样可以确保 CMD 进程完全退出之后再继续执行后续的代码。这能有效避免因为未完全结束而导致的资源泄露。

  2. 异常处理:在执行命令和处理关闭事件时加入了异常捕获,以防止由于意外情况导致程序崩溃。

  3. 对用户友好的提示:确保用户知道当前正在运行的状态,并给出清晰的选项。

通过这些改动,可以提高命令执行过程中的稳定性,并确保在窗体关闭时能够正确、可靠地终止 CMD 命令。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19542

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?