gpt4 book ai didi

c# - 实时将流重定向到文本框

转载 作者:太空宇宙 更新时间:2023-11-03 17:02:40 24 4
gpt4 key购买 nike

我遇到了一个有趣的难题,即我的应用程序可以作为控制台应用程序或 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 包含另一个文本框控件的内容,以便我的应用程序可以从此流而不是直接从文本框读取内容。

提前致谢。

最佳答案

我设法通过创建 ConcurrentStreamWriter 解决了这个问题继承类 StreamWriter并使用 ConcurrentQueueBackgroundWorker 支持处理队列的内容。

这是我想出的解决方案:

using System;
using System.Collections.Concurrent;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Windows.Forms;

namespace Quest.Core.IO
{
public class ConcurrentStreamWriter : StreamWriter
{
private ConcurrentQueue<String> _stringQueue = new ConcurrentQueue<String>();
private Boolean _disposing;
private RichTextBox _textBox;

public ConcurrentStreamWriter( Stream stream )
: base( stream )
{
CreateQueueListener();
}

public ConcurrentStreamWriter( Stream stream, RichTextBox textBox )
: this( stream )
{
_textBox = textBox;
}

public override void WriteLine()
{
base.WriteLine();
_stringQueue.Enqueue( Environment.NewLine );
}

public override void WriteLine( string value )
{
base.WriteLine( value );
_stringQueue.Enqueue( String.Format( "{0}\n", value ) );
}

public override void Write( string value )
{
base.Write( value );
_stringQueue.Enqueue( value );
}

protected override void Dispose( bool disposing )
{
base.Dispose( disposing );

_disposing = disposing;
}

private void CreateQueueListener()
{
var bw = new BackgroundWorker();

bw.DoWork += ( sender, args ) =>
{
while ( !_disposing )
{
if ( _stringQueue.Count > 0 )
{
string value = string.Empty;
if ( _stringQueue.TryDequeue( out value ) )
{
if ( _textBox != null )
{
if ( _textBox.InvokeRequired )
{
_textBox.Invoke( new Action( () =>
{
_textBox.AppendText( value );
_textBox.ScrollToCaret();
} ) );
}
else
{
_textBox.AppendText( value );
_textBox.ScrollToCaret();
}
}
}
}
}
};

bw.RunWorkerAsync();

}

}
}

关于c# - 实时将流重定向到文本框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18765140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com