开发者

C#Process的OutputDataReceived事件不触发问题及解决

开发者 https://www.devze.com 2023-02-26 10:29 出处:网络 作者: time-flies
目录C#Process OutputDataReceived事件不触发问题描述解决方法C#Process的详细用法总结C#Process OutputDataReceived事件不触发
目录
  • C#Process OutputDataReceived事件不触发
    • 问题描述
    • 解决方法
  • C#Process的详细用法
    • 总结

      C#Process OutputDataReceived事件不触发

      问题描述

      项目需要用cmd调用其它软件,实时获取软件处理结果,并根据获取到的结果决定下一步的输出,代码如下:

      Process proCmd = null;
      proCmd = new Process();
      proCmd.StartInfo.FileName = "cmd.开发者_Pythonexe";       //cmd 
      proCmd.StartInfo.UseShellExecute = false;     //不显示shell编程          
      proCmd.StartInfo.CreateNoWindow = true;      //不创建窗口 
      proCmd.StartInfo.RedirectStandardInput = true;   //打开流输入 
      proCmd.StartInfo.RedirectStandardOutput = true;  //打开流输出 
      proCmd.StartInfo.RedirectStandardError = true;   //打开错误流 
      proCmd.StandardInput.AutoFlush = true;       //每次调用 Write()之后,将其缓冲区刷新到基础流
      proCmd.OutputDataReceived += UpdateCmd;
      proCmd.ErrorDataReceived += UpdateCmd;
      
      proCmd.Start();//执行 
      proCmd.StandardInput.WriteLine(shell);  

      但是,Process的OutputDataReceived、ErrorDataReceived两个事件一直没有触发。

      解决方法

      Process的OutputDataReceived、ErrorDataReceived两个事件只会异步读取操作过程中发生,需调用 Process的BeginErrorReadLine 、BeginOutputReadLine方法启动异步读取操作

      执行命令的代码修改如下:

      proCmd.Start();//执行 
      proCmd.BeginOutputReadLine();
      proCmd.BeginErrorReadLine();
      proCmd.StandardInput.WriteLine(shell);

      C#Process的详细用法

      process进程类,介绍一下六种使用方法

      Process process = new Process();//实例
      process.StartInfo.CreateNoWindow = true;//设定不显示窗口
      process.StartInfo.UseShellExecute = false;
      process.StartInfo.FileName = "cmd.exe"; //设定程序名
      process.StartInfo.RedirectStandardInput = true; //重定向标准输入
      process.StartInfo.RedirectStandardOutput = true; //重定向标准输出
      process.StartInfo.RedirectStandardError = true;//重定向错误输出
      process.Start();
      process.StandardInput.WriteLine("ipconfig");//执行的命令
      process.StandardInput.WriteLine("exitjavascript");
      process.WaitForExit();
      process.Close();
      return process.StandardOutput.ReadToEnd();www.devze.com

      (1) publicbool Start () //启动360浏览器,并打开某个网站

      System.Diagnostics.Process process = new System.Diagnostics.Process();
      process.StartInfo.FileName = "360se.exe";  //启动36编程0浏览器,可以更换
      process.StartInfo.Arguments = "http://www.sina.com";
      process.Start();

      (2) publicstaticProcessStart (ProcessStartInfostartInfo)//打开资源管理器并指向某个路径

      System.Diagnostics.ProcessStartInfo processStartInfo = new
      System.Diagnostics.ProcessStartInfo();
      processStartInfo.FileName = "explorer.exe"; //资源管理器
      processStartInfo.Arguments = @"D:\";
      System.Diagnostics.Process.Start(processStartInfo);

      (3) publicstaticProcessStart (stringfileName)//用默认方式打开某个应用,即直接打开某个exe(两种方法)

      System.Diagnostics.Process.Start(@"D:\Program Files\Tencent\QQ\Bin\QQ.exe"); //直接调用打开文件

      (4) Process.Start (StringfileName, Stringarguments) //用某种应用打开某个文件

      System.Diagnostics.Process.Start("explorer.exe", "D:\\Readme.txt");  //直接打开文件Readme.txt

      上面已经举例了用process.start()打开网站的方法,现在讲讲用proceswww.devze.comss.star()定位到某个文件的方法。

      (5) 关闭某个进程

      Process[] p = Process.GetProcessesByName(proName); //根据进程命获得指定的进程
      p[0].Kill(); //杀死该进程

      (6) 获得本机的进程

      Process[] proList = Process.GetProcesses(".");//获得本机的进程
      int k = proList.Length.ToString(); //当前进程数量

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号