尝试通过线程

时间:2017-11-09 02:35:10

标签: c# multithreading winforms

我想在一个线程中更新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
            });
        }
    }
}

提前致谢。

1 个答案:

答案 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";

我想警告你关于你的代码。它不是线程安全的,可能会发生竞争条件。