在之前的代码中,终止 CMD 命令的逻辑可能存在一定问题,特别是在处理窗口关闭时。为了确保 CMD 进程能够可靠地被终止,我们可以使用 Process
类中的一些方法来更有效地管理子进程。以下是改进的版本:
改进代码示例
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace CmdExecutor
{
public partial class MainForm : Form
{
private Process cmdProcess;
public MainForm()
{
InitializeComponent();
}
private void btnExecute_Click(object sender, EventArgs e)
{
ExecuteCommand("your_command_here"); // 替换成您想要执行的CMD命令
}
private void ExecuteCommand(string command)
{
cmdProcess = new Process();
cmdProcess.StartInfo.FileName = "cmd.exe";
cmdProcess.StartInfo.Arguments = "/C " + command; // /C 表示执行完命令后终止CMD
cmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向输出流
cmdProcess.StartInfo.UseShellExecute = false; // 不使用操作系统外壳启动进程
cmdProcess.StartInfo.CreateNoWindow = true; // 不创建窗口
cmdProcess.OutputDataReceived += CmdProcess_OutputDataReceived; // 添加事件处理器
try
{
cmdProcess.Start(); // 启动进程
cmdProcess.BeginOutputReadLine(); // 开始异步读取输出
}
catch (Exception ex)
{
MessageBox.Show($"启动命令失败: {ex.Message}");
}
}
private void CmdProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
AppendTextToTextBox(e.Data);
}
}
private void AppendTextToTextBox(string text)
{
if (textBoxOutput.InvokeRequired)
{
textBoxOutput.Invoke(new Action<string>(AppendTextToTextBox), text);
return;
}
textBoxOutput.AppendText(text + Environment.NewLine);
textBoxOutput.ScrollToCaret(); // 滚动到文本框底部以查看最新输出
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (cmdProcess != null && !cmdProcess.HasExited)
{
var result = MessageBox.Show("正在执行CMD命令,确认要关闭吗?", "确认", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
try
{
cmdProcess.Kill(); // 终止进程
cmdProcess.WaitForExit(); // 等待进程完全退出,确保释放资源
cmdProcess.Dispose(); // 释放资源
}
catch (Exception ex)
{
MessageBox.Show($"无法终止进程: {ex.Message}");
}
}
else
{
e.Cancel = true; // 取消关闭操作
}
}
}
}
}
改动点解释:
使用
WaitForExit()
:在调用Kill()
后,我们添加了WaitForExit()
方法,这样可以确保 CMD 进程完全退出之后再继续执行后续的代码。这能有效避免因为未完全结束而导致的资源泄露。异常处理:在执行命令和处理关闭事件时加入了异常捕获,以防止由于意外情况导致程序崩溃。
对用户友好的提示:确保用户知道当前正在运行的状态,并给出清晰的选项。
通过这些改动,可以提高命令执行过程中的稳定性,并确保在窗体关闭时能够正确、可靠地终止 CMD 命令。
内容由零声教学AI助手提供,问题来源于学员提问