Thread, opérations longues et progressbar
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:
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:
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 :D