实时将流重定向到文本框

时间:2013-09-12 13:03:51

标签: c# winforms console textreader textwriter

我遇到了一个有趣的困境,我的应用程序可以作为控制台应用程序或Windows窗体应用程序运行。

因为我不想在我的应用程序中编写像这样的大量代码:

If ( IsConsoleApp() )
{
    // process Console input and output
}
else
{
    // process Windows input and output
}

为了防止这种情况,我决定创建两个方法,我可以传入TextReader和TextWriter实例,然后使用它们来处理输入和输出,例如。

public void SetOutputStream( TextWriter outputStream )
{
    _outputStream = outputStream;
}

public void SetInputStream( TextReader inputStream )
{
    _inputStream = inputStream;
}

// To use in a Console App:
SetOutputStream( Console.Out );
SetInputStream( Console.In );

要在控制台窗口中显示一些文本,我只需要执行以下操作:

_outputStream.WriteLine( "Hello, World!");

文本被神奇地重定向到控制台。

现在,我的问题是如何为Windows应用程序执行类似的操作?我创建了一个带有只读文本框控件的表单,我希望_outputStream的内容能够实时重定向到此文本框。

另外,我希望_inputStream包含另一个文本框控件的内容,以便我的应用程序可以直接从此流而不是文本框中读取。

提前致谢。

2 个答案:

答案 0 :(得分:-1)

框架中没有这样的内容。而不是艰难地做,只需添加一个静态助手方法(随处可用),只要你想输出一些东西,你就会调用它:

public static void Output(string message)
{
    if ( IsConsoleApp() )
    {
        // process Console input and output
    }
    else
    {
        // process Windows input and output
    }
}

当您想要显示输出时,只需要一行:

Utils.Output("Hello, World!");

要确定是否以控制台身份运行,您可以使用以下代码:

private static bool? IsConsole = null;
public static void Output(string message)
{
    if (IsConsole == null)
    {
        int width;
        try
        {
            width = Console.WindowWidth;
        }
        catch
        {
            width = 0;
        }
        IsConsole = (width > 0);
    }

    if (IsConsole.Value == true)
    {
        // process Console input and output
    }
    else
    {
        // process Windows input and output
    }
}

不是超级优雅,但应该有用。

答案 1 :(得分:-1)

我设法通过创建一个继承ConcurrentStreamWriter的{​​{1}}类并使用由StreamWriter备份的ConcurrentQueue来处理队列的内容来解决此问题。

这是我提出的解决方案:

BackgroundWorker