0

我有控制台应用程序,可以用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)

4

0 回答 0