我遇到了一个问题,我认为这可能是由于我的类彼此传递对象的复杂性,所以我将其最小化了,问题仍然存在:
我在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属性之间的区别。
它们的实现方式有所不同。
TextBox.Text
基本上返回Control.Text
,该调用调用使用WindowText
的WindowText
。在代码注释中明确提到了可以调用GetWindowText跨线程。
您必须Invoke
UI代码(不能在UI之外的线程中运行UI):
Invoke