[best practices][thread] retrouver l'UI
Bonjour,
Je recherche les meilleures pratiques sur la question du multi-thread avec form.
J'ai déjà lu plei nde tuto, mais ils traitent toujours de cas simples, tout dans la même classe, etc.
j'ai une classe qui va se charger de tâches en background qui ne sera pas Form1.
je cherche a mettre en place le systeme le plus propre possible pour depuis cette classe appeller une methode de Form1 (en "delegate")
exemple,
soit la classe Form1 :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public partial class Form1 : Form
{
background worker;
public Form1()
{
InitializeComponent();
worker = new background();
}
private void button1_Click(object sender, EventArgs e)
{
worker.setup(par1.Text, par2.Text); // prépare les element pour le thread
// lance le nouveau thread.
Thread thread = new Thread(new ThreadStart(worker.start));
thread.IsBackground=true;
thread.Start();
}
public void display(string info) // met à jour l'UI
{
Label1.Text=info;
} |
et ma classe background :
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
| public class background
{
public readonly object verrou = new object();
delegate void strParamDelegate(string info);
private string p1, p2; // parametres pour le thread worker.
public void setup(string par1, string par2) // appel unique (avant de lancer le thread)
{
p1 = par1;
p2 = par2;
}
public void start() // thread "worker"
{
updateui(""); //par exemple
Thread.Sleep(1000);
}
// met à jour l'interface utilisateur
private void updateui(string info)
{
BeginInvoke(new strParamDelegate(XXXX.display), new object[]{info}); //delegate asynchrone
}
} |
Voilà, mon probleme est "par quoi je remplace XXXX ?"
je pourrais mettre la methode display en static (mais c'est trés crade)
je pourrais utiliser une variable globale faisant réference à ma form instanciée, mais bof
je pourrai passer une ref de l'instance du form instancié dans la classe background par l'intermediare de la methode setup()...
Bref, j'aimerai bien avoir qqchose de propre, et séparer la classe form de la classe de traitement...
Merci pour vos conseils.