Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何以有效的方式阅读儿童节目中的长句?_C#_.net_Visual Studio 2010_Stdout_Child Process - Fatal编程技术网

C# 如何以有效的方式阅读儿童节目中的长句?

C# 如何以有效的方式阅读儿童节目中的长句?,c#,.net,visual-studio-2010,stdout,child-process,C#,.net,Visual Studio 2010,Stdout,Child Process,注意:这个问题自第一个版本以来发生了显著的变化,因此一些评论或答案可能看起来很奇怪。请检查编辑历史记录,如果有什么奇怪的地方 我正在从C类库启动一个子进程 我正在使用Process.BeginOutputReadLine以异步方式读取输出/错误。我认为它不适用于很长的行,但问题似乎是它不可伸缩。在我的电脑中,一条128 kb的线路会立即被处理,一条512 kb的线路似乎需要大约一分钟,1 mb的线路似乎需要几分钟,而我已经等了大约两个小时,等待处理一条10 mb的线路,当我取消它时,它仍在工作

注意:这个问题自第一个版本以来发生了显著的变化,因此一些评论或答案可能看起来很奇怪。请检查编辑历史记录,如果有什么奇怪的地方

我正在从C类库启动一个子进程

我正在使用Process.BeginOutputReadLine以异步方式读取输出/错误。我认为它不适用于很长的行,但问题似乎是它不可伸缩。在我的电脑中,一条128 kb的线路会立即被处理,一条512 kb的线路似乎需要大约一分钟,1 mb的线路似乎需要几分钟,而我已经等了大约两个小时,等待处理一条10 mb的线路,当我取消它时,它仍在工作

直接从StandardOutput和StandardError流修复读取似乎很容易,但这些流中的数据似乎是缓冲的。如果我从stdout获取数据来填充缓冲区,然后从stderr获取更多数据,我无法找到方法来检查其中一个数据中是否有挂起的数据,如果我尝试从stderr读取,它将永远挂起。 为什么会这样,我做错了什么,正确的方法是什么

一些代码示例来说明我试图实现的目标

方案1:


Program1有一个常量,允许设置要生成的数据的大小,Program2启动Program1并尝试读取数据。我希望时间会随着大小而线性增长,但情况似乎更糟。

我希望我能理解你的问题。应用程序挂起在Process.WaitForExit上,因为这是Process.WaitForExit:

您可能希望在新线程中调用它: int创建进程的方法:

    Thread trd = new Thread(new ParameterizedThreadStart(Start));
     trd.Start();
并添加此方法:

  private void Start(object o)
  {
     ((Process)o).WaitForExit();
     // your code after process ended
  }

对不起,我好像没有正确地解释我的问题。我知道WaitForExit做什么,名字很清楚:问题是我有一个程序,它将大量数据写入stdout和stderr,然后它就结束了。当我用一个进程对象调用它时,它永远不会结束,也不会引发DataReceived事件。@JaimePardos我不知道DataReceived事件,我猜你说的是OutputDataReceived。当进程写入其标准输出时,OutputDataReceived事件应该上升。您可以在这里看到一个示例-我指的是OutputDataReceived和ErrorDataReceived。我知道他们做什么。问题是,在我的示例中,它们似乎不起作用。对不起,它似乎起作用,但对于大数据集来说,速度非常非常慢,因此我重新编写了这个问题。
    Thread trd = new Thread(new ParameterizedThreadStart(Start));
     trd.Start();
  private void Start(object o)
  {
     ((Process)o).WaitForExit();
     // your code after process ended
  }