我想在一个线程中更新TextBox.Text,但它不起作用,我收到此错误(法语):
System.InvalidOperationException:'Opérationinter-threads non-valide:lecontrôle'TextBOX'afait l'objet d'unaccèspartird'un thread autre que celui sur lequel ilaétécréé。'
英文(谷歌翻译)看起来像:
System.InvalidOperationException:'无效的线程间操作:'TextBOX'控件已从创建它的线程以外的线程中访问。'
我该怎么办? 这是我的代码:
using System;
using System.IO;
using System.Windows.Forms;
using System.Threading.Tasks;
namespace Ace
{
public partial class Checker : Form
{
public Checker()
{
InitializeComponent();
}
private void Checker_Load(object sender, EventArgs e)
{
status("Checking ...");
check();
status("Done !");
}
public void check()
{
int threads = 10;
var lines = File.ReadLines("test.txt");
Parallel.ForEach(lines, new ParallelOptions { MaxDegreeOfParallelism = threads }, line =>
{
TextBox.Text = TextBox.Text + line + "\n"; // THIS LINE
});
}
}
}
提前致谢。
答案 0 :(得分:0)
当尝试从除UI线程之外的其他线程修改组件时,必须在组件上调用 Invoke()。
变化:
TextBox.Text = TextBox.Text + line + "\n"; // THIS LINE
要:
TextBox.Invoke((Delegate)(() =>
{
TextBox.Text = TextBox.Text + line + "\n";
})));
你也可以改变:
TextBox.Text = TextBox.Text + line + "\n";
要:
TextBox.Text += line + "\n";
我想警告你关于你的代码。它不是线程安全的,可能会发生竞争条件。