TextBox和RichTextBox在线程方面的区别

问题描述 投票:3回答:2

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

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

在表单上,​​我添加了一个文本框,一个richtextbox,一个backgroundworker和一个用于激活background 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);
    }
}

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

textBox1.Text可通过表格访问,因此MessageBox可以正常显示。 richTextBox1.Text无法访问,并给我这个错误:

跨线程操作无效:控制'richTextBox1'是从不是在其上创建线程的线程访问的。

为什么?

我假设richTextBox具有更多的路由和换行符,但是.Text属性不完全相同吗?!这是怎么回事?

EDIT:我不认为这与已标记的问题重复,因为他不是为TextBox.Text工作,而是我的。我在问TextBox和RichTextBox .Text属性之间的区别。

c# .net winforms textbox richtextbox
2个回答
8
投票

它们的实现方式有所不同。

TextBox.Text基本上返回Control.Text,该调用调用使用WindowTextWindowText。在代码注释中明确提到了可以调用GetWindowText跨线程。


1
投票

您必须Invoke UI代码(不能在UI之外的线程中运行UI):

Invoke
© www.soinside.com 2019 - 2024. All rights reserved.