我有控制台应用程序,可以用richtextbox 转换winform。我想将控制台和富文本框重定向到彼此。所以每当我给他们写信时,文本都会复制到另一个。我的问题是当我在等待 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;
}
}
然后即时处理富文本框上的按 Enter 事件并通过 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)