有关线程的文本框和richtextbox之间的区别

jam*_*art 3 .net c# textbox richtextbox winforms

我遇到了一个问题,我认为这可能是由于我的类的复杂性将对象传递给对方所以我最小化它并且问题仍然存在:

我有一个在VS2017社区中创建的默认winform项目

在表单上我添加了一个文本框,一个richtextbox,一个backgroundworker和一个用于激活后台工作者的按钮.

我在表单中放入以下代码来填充文本框并在按钮单击时运行worker:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        textBox1.Text = "Hello";
        richTextBox1.Text = "World!";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (backgroundWorker1.IsBusy != true)
        {
            backgroundWorker1.RunWorkerAsync();
        }
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        MessageBox.Show(textBox1.Text);
        MessageBox.Show(richTextBox1.Text);
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行程序,我不明白接下来会发生什么.

textBox1.Text可从表格访问,以便MessageBox显示正常.richTextBox1.Text无法访问并给我这个错误:

跨线程操作无效:控制'richTextBox1'从其创建的线程以外的线程访问.

为什么?

我假设richTextBox有更多的路由和包装,但.Text属性不完全相同?!这里发生了什么?

编辑:我不认为这是一个重复的标记问题,因为他没有工作,TextBox.Text而我的是.我问的是TextBox和RichTextBox .Text属性之间的区别.

Rez*_*aei 8

它们的实现方式不同.

TextBox.Text基本上返回哪些使用的Control.Text调用.在代码注释中明确提到可以调用GetWindowText跨线程.因此,他们通过设置标志来关闭有意识的跨线程检查.WindowTextGetWindowTextinCrossThreadSafeCall

但因为ReachTextBox.Text它不依赖Control.Text.发送EM_STREAMOUT并使用结果.因此除了跨线程异常之外没有设置任何标志.

注意:您应该忽略这种情况,并且永远不要尝试从另一个线程访问UI元素.Invoke当您尝试与另一个线程的UI线程交互时,始终使用控件的方法.