[英]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.