相关疑难解决方法(0)

在单独的程序中将控制台输出重定向到文本框

我正在开发一个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)

.net c# console textbox winforms

49
推荐指数
2
解决办法
5万
查看次数

重定向进程输出C#

我想将Process的标准输出重定向到一个字符串,以便以后解析.我还希望在进程运行时看到屏幕上的输出,而不仅仅是当它完成运行时.

这甚至可能吗?

c# process output-redirect redirectstandardoutput

11
推荐指数
2
解决办法
2万
查看次数

实现异步"从流中读取所有当前可用的数据"操作

我最近提供了这个问题的答案: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)

StartSendingEventsStopSendingEvents做他们做广告的事情; 出于本讨论的目的,我们可以假设事件总是在不失一般性的情况下发送.

该类在内部使用这两个字段:

    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)

c# console asynchronous stream filestream

7
推荐指数
1
解决办法
2762
查看次数

在接收到新行之前读取进程 StandardOutput

我正在尝试做一些似乎超出 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# system.diagnostics

3
推荐指数
1
解决办法
2542
查看次数