将TextReader / Writer复制到更多地方

时间:2018-04-09 10:13:19

标签: c# textreader

我有可以使用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)

0 个答案:

没有答案