我正在开发一个Windows窗体应用程序,它要求我调用一个单独的程序来执行任务.该程序是一个控制台应用程序,我需要将标准输出从控制台重定向到我的程序中的TextBox.
从我的应用程序执行程序没有问题,但我不知道如何将输出重定向到我的应用程序.我需要在程序使用事件运行时捕获输出.
在我的应用程序停止并且文本以随机间隔不断变化之前,控制台程序并不意味着停止运行.我试图做的只是从控制台挂钩输出以触发事件处理程序,然后可以使用它来更新TextBox.
我使用C#编写程序代码并使用.NET框架进行开发.原始应用程序不是.NET程序.
编辑:这是我正在尝试做的示例代码.在我的最终应用程序中,我将用代码替换Console.WriteLine来更新TextBox.我试图在我的事件处理程序中设置断点,甚至没有达到.
void Method()
{
var p = new Process();
var path = @"C:\ConsoleApp.exe";
p.StartInfo.FileName = path;
p.StartInfo.UseShellExecute = false;
p.OutputDataReceived += p_OutputDataReceived;
p.Start();
}
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(">>> {0}", e.Data);
}
Run Code Online (Sandbox Code Playgroud) 我想将Process的标准输出重定向到一个字符串,以便以后解析.我还希望在进程运行时看到屏幕上的输出,而不仅仅是当它完成运行时.
这甚至可能吗?
我最近提供了这个问题的答案:C# - 实时控制台输出重定向.
正如经常发生的那样,解释一些东西(这里的"东西"就是我解决类似问题的方式)会让你更加了解和/或就像这里的"oops"时刻一样.我意识到我的解决方案已实施,但有一个错误.这个bug没什么实际意义,但作为一个开发人员,它对我来说非常重要:我知道我的代码有可能爆炸,我不能轻易放松.
压缩bug是这个问题的目的.我为长篇介绍道歉,让我们变得肮脏.
我想构建一个允许我从控制台的标准输出接收输入的类Stream.控制台输出流是类型FileStream; 如果需要,实现可以转换为该实现.StreamReader杠杆作用已经存在相关联.
我需要在这个类中实现一件事来实现我想要的功能:异步"读取此刻可用的所有数据"操作.读到流的末尾是不可行的,因为除非进程关闭控制台输出句柄,否则流不会结束,并且它不会这样做,因为它是交互式的并且在继续之前期望输入.
我将使用该假设的异步操作来实现基于事件的通知,这对我的调用者来说会更方便.
该类的公共接口是这样的:
public class ConsoleAutomator {
public event EventHandler<ConsoleOutputReadEventArgs> StandardOutputRead;
public void StartSendingEvents();
public void StopSendingEvents();
}
Run Code Online (Sandbox Code Playgroud)
StartSendingEvents并StopSendingEvents做他们做广告的事情; 出于本讨论的目的,我们可以假设事件总是在不失一般性的情况下发送.
该类在内部使用这两个字段:
protected readonly StringBuilder inputAccumulator = new StringBuilder();
protected readonly byte[] buffer = new byte[256];
Run Code Online (Sandbox Code Playgroud)
该类的功能在以下方法中实现.为了让球滚动:
public void StartSendingEvents();
{
this.stopAutomation = false;
this.BeginReadAsync();
}
Run Code Online (Sandbox Code Playgroud)
要从Stream无阻塞中读取数据,并且不需要回车符,BeginRead则称为:
protected void BeginReadAsync()
{
if (!this.stopAutomation) {
this.StandardOutput.BaseStream.BeginRead(
this.buffer, 0, this.buffer.Length, this.ReadHappened, …Run Code Online (Sandbox Code Playgroud) 我正在尝试做一些似乎超出 System.Diagnostics.Process 对象范围的事情。可接受的答案可以提出不同的方法,只要它使用 .net 4.5/c#5。
我的程序正在调用 gdalwarp.exe 对大型 tiff 文件执行长时间运行的进程。Galwarp.exe 以这种格式输出。
Creating output file that is 6014P x 4988L.
Processing input file [FileName].tiff.
Using band 4 of source image as alpha.
Using band 4 of destination image as alpha.
0...10...20...30...40...50...60...70...80...90...100 - done.
Run Code Online (Sandbox Code Playgroud)
最后一行缓慢流入以指示进展。我想在它发生变化时阅读该行,以便我可以移动进度条以通知用户。
首先,我尝试读取,Process.StandardOutput但在整个过程完成之前它不会提供任何数据。其次,我尝试调用Process.BeginOutputReadLine()并连接该事件,Process.OutputDataReceived但它仅在线路完成时触发。
这是对 Execute GDalWarp.exe 的调用。
public static void ResizeTiff(string SourceFile, string DestinationFile, float ResolutionWidth, float ResolutionHeight, Guid ProcessId)
{
var directory = GDalBin;
var exe = Path.Combine(directory, "gdalwarp.exe");
var args = …Run Code Online (Sandbox Code Playgroud) c# ×4
console ×2
.net ×1
asynchronous ×1
filestream ×1
process ×1
stream ×1
textbox ×1
winforms ×1