我有可以使用richtextbox转换winform的控制台应用程序。我想将控制台和richtextbox重定向到彼此。所以每当我写信给他们时,文字都会复制到另一个文本我的问题是我在等待ReadLine。我想对第一个ReadLine做出反应。这是我的代码:
class ConsoleFormReDirectWriter : TextWriter
{
TextWriter t;
RichTextBox r;
public ConsoleFormReDirectWriter(TextWriter TextWriter, RichTextBox FormOut)
{
t = TextWriter;
r = FormOut;
}
public override void Write(char value)
{
t.Write(value);
RichTextBoxExtensions.AppendText(r, value +"", Color.White);
}
public override void WriteLine(string line)
{
t.WriteLine(line);
RichTextBoxExtensions.AppendText(r, line+"\n", Color.White);
}
public override Encoding Encoding
{
get { return Encoding.Default; }
}
}
class ConsoleFormReDirectReader : TextReader
{
Queue<string> ReadLineQ = new Queue<string>();
public void AddToReadLineQueue(string s)
{
ReadLineQ.Enqueue(s);
}
public override string ReadLine()
{
string line = "";
while (true)
{
if (ReadLineQ.Count != 0) { line = ReadLineQ.Dequeue(); break; }
}
return line;
}
}
然后即时处理在richtext框上输入事件和currentLine的依赖队列。我不知道怎么用控制台制作类似的东西。
还是有更好的方法吗?
PS:我可以创建一个新的线程,它将在无限循环中询问控制台的readline,并且当readline返回一些东西时,我可以追加队列。但这似乎非常不完整。
过了一会儿,我找到了半解决方案。我使用Console.readline超时和 现在我有我的Readline:
public override string ReadLine()
{
bool toConsole=false, toUI=false;
string line = "";
while (true)
{
if (ReadLineQ.Count != 0)
{ line = ReadLineQ.Dequeue();
toConsole = true;
break;
}
try
{
line = DelayReader.ReadLine(50);
}
catch(TimeoutException) { continue; }
toUI = true;
break;
}
if (toConsole) t.WriteLine(line);
if (toUI) RichTextBoxExtensions.AppendText(r, line + "\n", Color.White);
return line;
}
延迟的Console.Readline我在这里:ReadLine(delay)