【问题标题】:Execute Process Chain执行流程链
【发布时间】:2011-03-02 16:16:27
【问题描述】:
  public void ExecuteProcessChain(string[] asProcesses, string sInRedirect, string sOutRedirect)
    {
            Process p1 = new Process();
            p1.StartInfo.UseShellExecute = false;
            p1.StartInfo.RedirectStandardOutput = true;
            p1.StartInfo.FileName = asProcesses[0];
            p1.Start();
            StreamReader sr = p1.StandardOutput;
            string s, xxx = "";
            while ((s = sr.ReadLine()) != null)
                Console.WriteLine("sdfdsfs");
                //xxx += s+"\n";
            p1.StartInfo.RedirectStandardInput = true;
            p1.StartInfo.RedirectStandardOutput = false;
            p1.StartInfo.FileName = asProcesses[1];
            p1.Start();
            StreamWriter sw = p1.StandardInput;
            sw.Write(xxx);
            sw.Close();
            sr.Close();

    }

我正在尝试执行“calc|calc”,但是当我这样做时,它会卡在while ((s = sr.ReadLine()) != null) 行,并且只有在我关闭计算器后代码才会继续。我需要两个计算器一起工作。你知道怎么做吗?

【问题讨论】:

  • 你为什么用while ((s = sr.ReadLine()) != null)这个语句?
  • 因为我需要读取数据,例如: ls|sort ,我需要读取 ls 行并对其进行排序。
  • 这是否偶然地与 Roy Gavrielov 的作业相同?:how can I check if the process got output? 即使变量名相同,我对他问题的回答也应该对您有用。
  • 顺便说一句,您不必关闭读写器,因为它们不会绑定任何非托管资源。根据经验,只有在创建流、读取器或写入器时才应关闭它。如果它是 IDisposable(适用于所有 Streams 和大多数 Readers 和 Writers),则应尽可能使用 using statement。这与关闭 Stream 的效果相同,但更易于阅读并防止一些常见错误。
  • 我注意到的其他一些小事情:string s, xxx = ""; 仅将xxx 设置为"",s 未初始化。函数的参数按照Systems Hungarian命名。这可能是你的任务的一部分,但它是generally seen as bad practice, especially in C#。这是一篇关于这个主题的有趣文章:Making Wrong Code Look Wrong

标签: c# streamreader chain


【解决方案1】:

ReadLine 正在读取第一个计算的输出。 Calc 不发送任何输出。因此,ReadLine 将永远不会返回,因此下一次计算将不会开始。当第一个计算终止时,ReadLine 不能再从第一个计算中读取,因此返回 null。返回后,代码就可以开始第二次计算了。

您可以不从第一个计算中读取或异步读取。 您可能想参考Async ReadLine 了解如何 异步读取。

您也可以在开始调用 ReadLine 之前使用 p2 开始第二次计算。

【讨论】:

    【解决方案2】:

    为什么不使用线程?

    考虑一下:将每个 calc 放入一个线程中,然后同时启动它们。之后让程序等待他们。只有在两个线程都完成了它们的工作(读取数据)之后,你才能继续。

    请记住,线程不能直接更改来自另一个线程的数据,因此我可能会建议使用 Invoke 或静态变量,具体取决于您可能需要的内容。

    如果可能,您可以使用已经有一些有用方法的任务/并行库来帮助您。

    Background Worker 太难了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 2021-06-27
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多