【问题标题】:C# Console.SetOut Cross-thread operation not validC# Console.SetOut 跨线程操作无效
【发布时间】:2013-10-14 21:47:41
【问题描述】:

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

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

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”从创建它的线程以外的线程访问。

【问题讨论】:

    标签: c# multithreading console


    【解决方案1】:

    控件不能由 UI 线程以外的线程更改。您的控制台正在运行自己的线程。它正在调用您的类并尝试更改文本框文本。

    要阻止这种情况,您需要确保文本更改操作发生在 UI 线程上。您可以使用 Invoke:

    来执行此操作
    _output.Invoke(new MethodInvoker(() => _output.AppendText(value.ToString())));
    

    【讨论】:

    • 啊,我明白了,所以我也可以使用调用来更改其他类的标签文本?
    • 这不是“来自另一个类”.. 它是“来自另一个线程”。控制台在其自己的线程中运行。因此实际上不允许直接访问 WinForms UI 线程。但是,是的,你是对的。
    • 哦,是的,对不起:P 这就是我的意思。
    • 非常感谢! MSDN 是否有关于 Invoke 的信息页面?我很想读。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      正如错误试图告诉您的那样,您无法从非 UI 线程与 UI 交互。

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-15
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多