Voici la situation: Je développe une application simple avec la structure suivante:Ma forme ne présente pas correctement lorsqu'il est lancé à partir d'un autre thread
- FormMain (point de démarrage)
- FormNotification
- CompleFunctions
À droite?
Eh bien, dans FormMain J'ai la fonction suivante:
private void DoItInNewThread(ParameterizedThreadStart pParameterizedThreadStart, object pParameters, ThreadPriority pThreadPriority)
{
Thread oThread = new Thread(pParameterizedThreadStart);
oThread.CurrentUICulture = Settings.Instance.Language;
oThread.IsBackground = true;
oThread.Priority = pThreadPriority;
oThread.Name = "μRemote: Background operation";
oThread.Start(pParameters);
}
Donc, chaque fois que je dois appeler un temps méthode consommation situé sur ComplexFunctions Je fais ce qui suit:
// This is FormMain.cs
string strSomeParameter = "lala";
DoItInNewThread(new ParameterizedThreadStart(ComplexFunctions.DoSomething), strSomeParameter, ThreadPriority.Normal);
L'autre classe, FormNotification, est un formulaire qui affiche des informations sur le processus à l'utilisateur. Cette notification de formulaire peut être appelée à partir de FormMain ou de ComplexFunctions. Exemple:
// This is ComplexFunctions.cs
public void DoSomething(string pSomeParameter)
{
// Imagine some time consuming task
FormNotification formNotif = new FormNotification();
formNotif.Notify();
}
FormNotify dispose d'une minuterie, de sorte que, au bout de 10 secondes ferme le formulaire. Je n'utilise pas formNotif.ShowDialog parce que je ne veux pas mettre l'accent sur ce formulaire. Vous pouvez vérifier this link pour voir ce que je fais dans Notify.
Ok, voici le problème: Quand j'appelle FormNotify de ComplexFunction qui est appelé à partir d'un autre thread dans FormMain ... ce FormNotify disparaît après quelques millisecondes. Il est le même effet que lorsque vous faites quelque chose comme ceci:
using(FormSomething formSomething = new FormSomething)
{
formSomething.Show();
}
Comment éviter cela?
Ce sont des solutions possibles que je ne veux pas utiliser:
- Utilisation Thread.Sleep (10000) dans FormNotify
- Utilisation FormNotif.ShowDialog()
C'est un scénario simplifié (FormNotify fait d'autres choses fantaisistes qui restent pendant 10 secondes, mais elles ne sont pas pertinentes pour voir le problème).
Merci pour votre temps !!! Et s'il vous plaît, désolé mon anglais.
J'utilise cette directive (en FormMain): CheckForIllegalCrossThreadCalls = false; Est-ce cela dont vous parlez? –
C'EST MAUVAIS MAUVAIS !!! N'utilisez jamais cette méthode. Le thread d'arrière-plan doit être utilisé pour effectuer le traitement, mais toutes les fenêtres doivent être appelées depuis le thread ui principal. – Micah
Ok, maintenant je me sens comme un échantillon de "mauvaises pratiques" –