Bonjour,

Je sais qu'il s'agit d'un sujet récurent et j'ai pu voir plusieurs post à ce sujet ici et ailleurs (stackoverflow) mais je reste quand même bloqué.

Dans mon application (Winform) j'ai un bouton refresh qui permet de mettre à jour les données de mon Datagridview depuis ma base de données. Pour cela, j'ai voulu afficher une seconde form avec une progressbar qui se met en superposition de la form principale.
Pour mettre en place cela j'ai vu sur des forums que je pouvais utiliser un BackgroundWorker pour gérer le traitement de mise à jour et la progression de ma progressbar dans ma second form.
Après avoir suivi des exemples, le DoWork s'arrêtait après la première instruction de ma fonction RefreshData(). J'ai vite compris que je recevais une exception mais qui ne s'affichait pas. Grâce à internet j'ai pu régler ce soucis et afficher l'erreur.

Cependant, une fois l'exception bien visible j'ai pu comprendre que j'avais un problème de Thread.
"Error : System.InvalidOperationException: Opération inter-threads non valide : le contrôle 'refresh_bnt' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé...."

De ce que j'ai pu comprendre en cherchant sur le net, il s'agit d'un soucis entre le thread principale de l'UI et celui du BackroundWorker. J'avoue que je suis pas vraiment familier avec la notion de Thread (et je devrais peut-être). J'ai cherché comment je pouvais régler ce problème et c'est là que je bloque.
Tout ce que j'ai vu, proposent des solutions différentes (utiliser des Invoke, ajouter en paramètre le sender du DoWork dans la fonction etc...).

C'est pour ça que je me suis décidé à demander de l'aide concernant mon cas pour mieux comprendre. Je vous mets ci-dessous la structure de mon code et vous remercie par avance pour vos retours

NB : mon backroundworker se trouve dans la Form1 (principale) avec la propriété "WorkerReportsProgress" à true

Form1
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
40
41
42
43
44
45
46
47
48
49
50
51
52
 
private FormBackgroundWorker frmPgBar = new FormBackgroundWorker(); // Form2
private bool DoWork = false;
 
private void refresh_btn_Click(object sender, EventArgs e)
{
	DoWork = true;
 
	backgroundWorker1.RunWorkerAsync();
 
	frmPgBar.ShowDialog();
}
 
private void RefreshData()
{
	// Traitement :
	// Mise à jour de la BDD
	// Actualisation du DatagridView
	// Appel dans différentes partie du code de :
	// backgroundWorker1.ReportProgress(nombre); // nombre : avancement que je donne au fur et à mesure
 
	DoWork = false;
}
 
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
	RefreshData();
}
 
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
	// update the ProgressBar in frmPgBar
	frmPgBar.SetProgressBarValue(e.ProgressPercentage);
}
 
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
	if (e.Error != null)
	{
		// You have an exception, which you can examine through the e.Error property.
		MessageBox.Show("Error : " + e.Error.ToString());
	}
	else
	{
		// No exception in DoWork.
		if (!DoWork)
		{
			frmPgBar.Close();
			backgroundWorker1.ReportProgress(0);
		}
	}
}
Form2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
public void SetProgressBarValue(int pbValue)
{
    progressBar1.Value = pbValue;
    this.pourcentage_lb.Text = pbValue.ToString() + "%";
}