Bonjour à tous,
J'ai une appli en WPF 3.5 qui, avant de lancer sa fenêtre principale, doit effectuer certaines vérifications de pré-requis. Certaines des ces opérations peuvent être longues (plusieurs minutes) donc je me suis dit : thread parallèle + fenêtre affichant une barre de progression indéterminée.
J'ai tenté cela par 2 codes différents, les 2 ne sont pas du tout satisfaisants:
avec cette méthode, j'ai un gros carré blanc à la place de ma fenêtre wdwWait, avec un sablier et un fameux message "ne répond pas", en attedant la fin de de th.Join()...
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 /// <summary> /// classe gérant les appels au thread d'opérations longues /// </summary> public class ThreadManager { private static ThreadManager _instance = null; public static ThreadManager Instance { get { if (_instance == null) _instance = new ThreadManager(); return _instance; } } /// <summary> /// démarre le thread parallèle /// </summary> /// <param name="_callBack">méthode lancé par le thread</param> /// <param name="_actionName">intitulé de l'action</param> public void Launch(ThreadStart _callBack, string _actionName) { Thread th = new Thread(_callBack); th.IsBackground = true; th.Start(); wdwWait frmWait = new wdwWait(_actionName); frmWait.Show(); th.Join(); frmWait.Close(); } }
Avec cette option la, la fenêtre d'attente réagit bien, mais j'ai belle exception m'empêchant de fermer ma fenêtre à la fin du thread ("Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire.")
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 /// <summary> /// classe gérant les appels au thread d'opérations longues /// </summary> public class ThreadManager { private static ThreadManager _instance = null; public static ThreadManager Instance { get { if (_instance == null) _instance = new ThreadManager(); return _instance; } } private System.Timers.Timer t; private wdwWait frmWait; private Thread th; /// <summary> /// démarre le thread parallèle /// </summary> /// <param name="_callBack">méthode lancé par le thread</param> /// <param name="_actionName">intitulé de l'action</param> public void Launch(ThreadStart _callBack, string _actionName) { th = new Thread(_callBack); th.IsBackground = true; th.Start(); t = new System.Timers.Timer(500); t.Enabled = true; t.Elapsed += new System.Timers.ElapsedEventHandler(OnTimerTick); frmWait = new wdwWait(_actionName); frmWait.ShowDialog(); } public void OnTimerTick(object o, System.Timers.ElapsedEventArgs e) { if (!th.IsAlive) frmWait.Close(); } }
Je suis bien bloqué là, merci pour toute aide![]()
Partager