繁体   English   中英

C#Console.SetOut跨线程操作无效

[英]C# Console.SetOut Cross-thread operation not valid

我有一个控制台应用程序,我想为它制作一个GUI现在我想将控制台文本发送到文本框我知道这个问题更多,但我无法让它工作:S:S

我在Form1 Load中使用了这段代码:

private void Form1_Load(object sender, EventArgs e)
{
    Console.SetOut(new TextBoxWriter(consoleTextbox));
}

这是TextBoxWriter类:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace KLFClient
{
    public class TextBoxWriter : TextWriter
    {
        TextBox _output = null;

        public TextBoxWriter(TextBox output)
        {
            _output = output;
        }

        public override void Write(char value)
        {
            base.Write(value);
            _output.AppendText(value.ToString());
        }

        public override Encoding Encoding
        {
            get { return System.Text.Encoding.UTF8; }
        }
    }
}

但是,当我启动我的程序并启动我的服务器系统时,它返回此错误:

System.Windows.Forms.dll中发生了未处理的“System.InvalidOperationException”类型异常

附加信息:跨线程操作无效:控制'consoleTextbox'从其创建的线程以外的线程访问。

UI线程以外的线程无法更改控件。 您的控制台正在运行自己的Thread ..它正在调用您的类并尝试更改Textboxes文本。

要停止此操作,您需要确保在UI线程上进行文本更改操作。 您可以使用say, Invoke来执行此操作:

_output.Invoke(new MethodInvoker(() => _output.AppendText(value.ToString())));

Windows窗体UI控件只能从UI线程访问。 您可以在控件上使用Invoke()方法来排队要在所述线程上运行的操作。 例如,您可以将Write()的实现更改为:

    public override void Write(char value)
    {
        var text = value.ToString();
        this._output.Invoke(new Action(() => this._output.AppendText(text)));
    }

由于错误试图告诉您,您无法从非UI线程与UI进行交互。

后台线程正在尝试写入控制台,使您的流与错误线程中的文本框进行交互。

相反,您应该在Write()调用BeginInvoke()方法,以在UI线程上异步运行代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM