Bonjour,

J'ai un souci avec le backgroundworker, et je souhaite savoir si quelqu'un peut m'aider. mon application est composé d'un TabControl auquel est aloué dynamiquement un controle utilisateur.

Quand je fonctionne en monothread, il n'y a pas de souci. Mais ceci demandant beaucoup de ressources et affectant un freeze de mon interface graphique, j'ai décidé de le mettre une partie du traitement dans le backgroundWorker.

mon backgroudworker est créé dans la form principale. elle fait appel à une méthode qui va se charger d'alouer dynamiquement des controles utilisateur dans les TabPages correspondant.

Tout ceci à l'air de fonctionner jusqu'au moment où je souhaite afficher le tour (dans la méthode du backgroundworker : RunWorkerCompleted). Je demande l'affichage via des méthodes. Et voici le message d'érreur qui j'ai à l'execution :

Opération inter-threads non valide : le contrôle 'StatsTab' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
Voici la partie du code du backgroundworker :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
 public void AddClient(AveragesData[][] Data)
        {
            //this.DelAllClientTabs();
 
            CurrentData = Data;
            ClientStat = new SimotionTab[Data.Length];            //create as many Simotion tab's group as number of client
            LoadForm = new Loading();
            backgroundWorker1.RunWorkerAsync();
 
        }
 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int Client = 0; Client < CurrentData.Length; Client++)
            {
                ClientStat[Client] = new SimotionTab();
                ClientStat[Client].Dock = DockStyle.Fill;
                ClientStat[Client].BackColor = Color.LightGray;
                ClientStat[Client].AddSimotionTab(CurrentData[Client]);
            }
        }
 
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            ClientTabControl = new TabControl();
 
            for (int Client = 0; Client < CurrentData.Length; Client++)
            {
                this.ClientTabControl.TabPages.Add(CurrentData[Client][0].ClientName);
                this.ClientTabControl.TabPages[Client].Controls.Add(ClientStat[Client]);
            }
            this.ClientTabControl.Dock = DockStyle.Fill;
            this.Controls.Add(ClientTabControl);
            this.QuickMenu.Visible = true;
 
            Sender.showClienttab();
 
        }
La méthode qui affiche le tout dans l'interface principale :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
public void showClienttab()
        {
            this.splitContainer1.Panel2.Controls.Add(clientTab1);
        }
Pouvez-vous m'aider car je ne retrouve pas ce genre de problème sur google?