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:

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 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
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();
        }
    }
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.")

Je suis bien bloqué là, merci pour toute aide