Bonjour,
Je me suis mis au C# il y a quelque mois pour développer une application à base de WinForms.
Jusqu'ici, tout va bien, l'ensemble marche pas trop mal, et j'ai appris pas mal de trucs intéressants, mais je suis maintenant face à un problème que je n'arrive pas résoudre... Faire en sorte que les fenêtres ne soient pas figées pendant le traitement d'une action de longue durée.
Je me suis donc documenté sur les différents manières de faire, j'ai retenu notamment le composant BackgroundWorker et la classe Thread. Je suis arrivé à mettre en œuvre les exemples trouvés sur MSDN ou ici, ainsi que ceux d'un bouquin que j'ai emprunté (mais qui date un peu : ".NET et C# version 2").
Mais transposé à mes besoins, ça ne marche pas.
J'utilise une API (propriétaire) avec laquelle on peut faire un tas de truc mais une des méthodes est assez longue à traiter, j'ai donc essayer de la faire traiter dans un thread ou un BackgroundWorker :
J'obtiens exactement le même résultat avec ce système qu'en appelant directement Reconnect dans OnLoaded : fenêtre figée (ie impossible de la redimensionner, de manipuler ses combobox, etc...).
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 namespace MyPlugin { partial class Form1 : Form { private Thread reco; // ... protected override void OnLoad(EventArgs e) { Application.Idle += new EventHandler(OnLoaded); base.OnLoad(e); } private void OnLoaded(object sender, EventArgs e) { Application.Idle -= new EventHandler(OnLoaded); //this.myAPI.Reconnect(usr, pwd); // Appel dans le thread Form mais long à traiter... Donc essai avec Thread : reco = new Thread(new ThreadStart(DoReconnect)); reco.Start(); reco.Join(); FillListView(myAPI.GetList()); } private void DoReconnect() { // Le thread accède à myAPI, usr, pwd mais ce sont pas des contrôles... this.myAPI.Reconnect(usr, pwd); } } }
Tous les exemples que j'ai mis en œuvre sont assez simples dans la mesure où les tâches confiées au deuxième thread ne sont pas une action sur un objet qui est utilisé tout au long de l'appli... Si vous pouvez me conseiller, merci. En espérant avoir été clair.
Partager