.NET BackGroundWorker - InvalidOperationException : inter-threads non valide

J'ai un projet codé en .NET Winforms.
J'ai besoin de mettre en œuvre une opération d'exploitation de données, imprimer le texte de la TextBox et mise à jour de la progression.

J'ai essayé d'utiliser BackgroundWorker à faire, mais il déclenche une exception InvalidOperationException (inter-threads non valide: le Contrôle "xxxxx" accessible à partir d'un thread autre que le thread qu'il a été créé sur)

Pour affiner les causes possibles du problème, j'ai commencé un nouveau projet, notamment les suivantes:
Bouton Pour démarrer le composant BackgroundWorker
Étiquette pour imprimer le texte.
Et ProgressBar.

Cependant, le résultat est le même. J'ai cherché sur SOF, et m'a dit d'utiliser un délégué, mais je ne suis pas familier avec elle.

C'est l'exemple de code qui génère l'erreur:

using System;
using System.Collections.Generic;
using System.ComponentModel;

namespace TestProject
{
    public partial class Form1 : Form
    {
        private readonly BackgroundWorker _bw = new BackgroundWorker();

        public Form1()
        {
            InitializeComponent();
            _bw.DoWork += RosterWork;
            _bw.ProgressChanged += BwProgressChanged;
            _bw.RunWorkerCompleted += BwRunWorkerCompleted;
            _bw.WorkerReportsProgress = true;
            _bw.WorkerSupportsCancellation = false;
        }

        private void RosterWork(object sender, DoWorkEventArgs doWorkEventArgs)
        {
            for (int i = 0; i < 1000; i++)
            {
                label1.Text = i.ToString();
                _bw.ReportProgress(Convert.ToInt32((i * (100 / 1000))));
            }
        }

        private void BwProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            progressBar1.Show();
            _bw.RunWorkerAsync();
        }

        private void BwRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            progressBar1.Hide();
        }

    }
}

Mise à jour:
J'ai suivi Jon Skeet réponse, - il vraiment travailler sur mon projet de test, mais pour en revenir à mon projet,

La Mise en page de mon Formulaire:

Forme -
TabControl
- Tab1
-Tab1Panel
-TextBox1

Quand atteignent cette ligne :

TextBox txtbox1 = new TextBox();
Tab1Panel.Controls.Add(txtbox1);

L'erreur se produisent encore quand j'ajoute de la zone de texte du Panneau de Contrôle par programmation.

Enfin,je l'ai remplacer par ceci:

 if (Tab1Panel.InvokeRequired)
     Tab1Panel.Invoke((MethodInvoker)delegate { Tab1Panel.Controls.Add(txtbox1); });
 else
     Tab1Panel.Controls.Add(txtbox1);

Tout ce qui est travail. Comment faire pour déterminer le contrôle est InvokeRequired, Est-il un contrôle d'?

OriginalL'auteur Cheung | 2011-11-01