ZBLOG

using System; using System.Diagnostics; using System.Threading.Tasks; using System.Windows.Forms; namespace CmdExecutor { public partial class MainForm : Form { private Process cmdProcess; // 用于保存当前执行的cmd进程 public MainFor...

您在代码中遇到的问题是,当窗口关闭时,虽然您尝试通过 cmdProcess.Kill() 来终止正在运行的命令,但是由于 OnFormClosing 方法中的逻辑可能没有正常执行。

首先,确保以下几点:

  1. 正确处理关闭事件:确保 OnFormClosing 事件处理程序中的逻辑可以正常执行。您可以添加一些调试信息,以确认是否进入了该逻辑。

  2. 检查 cmdProcess 的状态:在调用 cmdProcess.Kill() 前,可以再检查一次 cmdProcess.HasExited 的状态,以确定其确实处于活动状态。

  3. 捕获异常:在调用 cmdProcess.Kill() 时,最好用 try-catch 包裹,这样如果有异常发生,可以捕获并记录下来,而不是让应用崩溃。

以下是修改后的示例代码:

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.Dispose(); // 释放资源
            }
            catch (Exception ex)
            {
                MessageBox.Show($"无法终止进程: {ex.Message}");
            }

            e.Cancel = false; // 允许关闭窗体
        }
        else
        {
            e.Cancel = true; // 取消关闭操作
        }
    }
}

另外,请注意在此代码段中,在需要的时候使用了 Dispose() 方法来释放与进程相关的资源。

调试建议

  • 在 Windows 窗体应用中调试时,可以使用 Debug 输出调试信息,例如:
Debug.WriteLine("Attempting to close the form...");
  • 您也可以考虑使用更简化的方法来停止进程,例如发送一个简单的退出命令,而不是强行杀死它。在某些情况下,这会更优雅地处理 CMD 中正在运行的任务。

注意事项

  • 如果您的 CMD 命令本身包含了对其他外部资源或线程的调用,那么简单地杀掉 CMD 窗口可能不会立即结束所有相关的操作。
  • 有时,您可能还需要考虑错误处理和用户反馈,以确保用户了解当前系统状态。


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?