Framework 4.0, Tasks et Invoke
Bonjour,
j'étais en train d'essayer les tâches dans VS2010/FW 4.0 et je voulais modifier le contenu d'un contrôle dans une de ces tâches (en fait une tâche de continuation).
Evidemment, sans faire gaffe que j'étais dans un autre thread que celui de la GUI, je me suis fais jeter au moment où je mettais à jour le contrôle (une textbox).
Qu'à cela ne tienne, j'ai repris la procédure habituelle avec un delegate et un control.Invoke. Mais ça ne fonctionne pas :cry:
A force de tester et re-tester, j'ai créé un autre exemple avec un bouton qui lance un thread dans lequel je mets à jour le contrôle et ça marche ! 8O
Avec le même delegate, bien sûr.
J'avoue être un peu perdu. Et surtout, je ne trouve rien à ce sujet : tout ce que je trouve me renvoie à la même méthode : delegate+control.invoke.
Avez-vous plus d'infos à ce sujet ?
Voici le code, si vous voulez essayer :
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 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| public partial class Form1 : Form
{
public Task<int> t4;
public Task<bool> t5;
int x;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
t4.Start();
Console.WriteLine("t5 result : " + t5.Result);
Console.WriteLine("x = " + x);
}
private int Tache1(int i)
{
var sw = new SpinWait();
for (int j = 0; j < 1000; j++) { sw.SpinOnce(); }
Console.WriteLine("Première tâche terminée");
return 2*i;
}
private void Form1_Load(object sender, EventArgs e)
{
t4 = new Task<int>(() => Tache1(3), TaskCreationOptions.PreferFairness);
t5 = t4.ContinueWith((antecedent) =>
{
x = antecedent.Result;
//Affiche(x.ToString()); // Ne fonctionne pas, ça plante le programme
Console.WriteLine("Tâche de continuation terminée");
return true;
});
}
public delegate void MonDelegate(string text);
void Affiche(string pTexte)
{
textBox1.Invoke(new MonDelegate(UpdateText), new object[] { pTexte });
}
private void UpdateText(string text)
{
textBox1.Text = text;
}
private void button2_Click(object sender, EventArgs e)
{
Thread T = new Thread(Tutu);
T.Start();
}
private void Tutu()
{
Affiche("TUTU"); // Là ça marche
}
} |