c#启动程序时使用异步读取输出避免假死

某次调用某个exe,在cmd命令中调用正常,但是一旦使用代码调用则直接假死。

后来了解到原来是输出流阻塞导致的假死,这个时候只需要使用异步读取输出就可以了,直接上代码:

cs 复制代码
        public static bool ExecuteFileConvertHelper(string sPara)
        {
            try
            {
                // 获取当前程序所在的目录
                string exeDir = AppDomain.CurrentDomain.BaseDirectory;
                // 拼接 FileConvert.exe 的完整路径
                string exePath = Path.Combine(exeDir, "FileConvert.exe");

                // 检查文件是否存在
                if (!File.Exists(exePath))
                {
                    LibLogger.LogManager.GetManager().WriteCommon($"FileConvert.exe not found at: {exePath}");
                    return false;
                }

                // 创建一个新的进程启动信息
                ProcessStartInfo startInfo = new ProcessStartInfo
                {
                    FileName = exePath,
                    Arguments = sPara,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    UseShellExecute = false,
                    CreateNoWindow = true // 不创建窗口
                };

                // 启动进程
                using (Process process = Process.Start(startInfo))
                {
                    // 确保进程不是 null
                    if (process == null)
                    {
                        return false;
                    }

                    // 异步读取标准输出
                    process.OutputDataReceived += (sender, e) =>
                    {
                        if (!string.IsNullOrEmpty(e.Data))
                        {
                            // 可以在这里处理输出数据,例如记录日志
                            //LibLogger.LogManager.GetManager().WriteCommon(e.Data);
                        }
                    };

                    // 异步读取标准错误
                    process.ErrorDataReceived += (sender, e) =>
                    {
                        if (!string.IsNullOrEmpty(e.Data))
                        {
                            // 可以在这里处理错误数据,例如记录错误日志
                            //LibLogger.LogManager.GetManager().WriteCommon(e.Data);
                        }
                    };

                    // 开始异步读取
                    process.BeginOutputReadLine();
                    process.BeginErrorReadLine();

                    // 等待进程退出
                    process.WaitForExit();

                    // 检查退出代码
                    if (process.ExitCode == 0)
                    {
                        // 成功执行
                        return true;
                    }
                    else
                    {
                        // 执行失败
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                // 可以在这里记录异常日志
                LibLogger.LogManager.GetManager().WriteCommon(ex.Message);
                return false;
            }
    }

谨此纪念。

相关推荐
matlabgoodboy几秒前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序
江离w11 分钟前
新版vibecoding项目初始化指令
java
yuan1999713 分钟前
基于 C# 实现的 Omron HostLink (FINS) 协议 PLC 通讯
开发语言·c#
kyriewen21 分钟前
测试妹子让我写单测,我偷偷用AI一天干完一周的活
前端·chatgpt·cursor
2601_9577808430 分钟前
Claude Code 2026年最新部署指南:从环境搭建到技能扩展
前端·人工智能·ai编程·claude
tongluowan00738 分钟前
Spring MVC 底层工作流程+源码分析
java·spring·mvc
zhangfeng11331 小时前
workbuddy 专家 “前端开发师” 结合nvidia-mistral-small-4-119b-2603 项目计划-前端界面开发.md
前端·人工智能·免费
java1234_小锋1 小时前
SpringBoot为什么要禁止循环依赖?
java·数据库·spring boot
火星papa2 小时前
C# 任务(Task)的基础实现
c#·任务·task
折哥的程序人生 · 物流技术专研2 小时前
《Java 100 天进阶之路》第17篇:Java常用包装类与自动装箱拆箱深入
java·开发语言·后端·面试