IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Framework 4.0, Tasks et Invoke


Sujet :

Framework .NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 25
    Par défaut 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

    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 !
    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 : 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
    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
            }
        }

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Bizarre
    C'est quoi le message d'erreur ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 25
    Par défaut
    Il n'y a pas de message particulier Le programme semble boucler sur l'appel au delegate, bien que l'occupation processeur reste à 0%.


    Je crois avoir trouvé, par contre...

    Il semble que ça vienne en fait de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine("t5 result : " + t5.Result);
    t5 n'est pas terminée au moment de l'appel

    Si je change pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (t5.IsCompleted) Console.WriteLine("t5 result : " + t5.Result);
    alors ça marche tout de suite mieux...

    Je m'en suis aperçu lorsque que le debuger mettait beaucoup (beaucoup) de temps à arriver sur mon point d'arrêt.

    Je suis là-dessus depuis hier


    Désolé de vous avoir embêté pour si peu

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Becafuel Voir le message
    Désolé de vous avoir embêté pour si peu
    Pas de problème, le forum est là pour ça

    N'oublie pas de marquer le sujet comme si c'est OK (bouton en bas de la page)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MVC] Différences entre les framework MVC push et pull ?
    Par XavierZERO dans le forum Frameworks Web
    Réponses: 5
    Dernier message: 15/01/2004, 13h12
  2. Recherche un framework RAD pour Eclipse
    Par Almex dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 08/10/2003, 12h24
  3. [Persistence][Framework]Avis.
    Par quilo dans le forum Persistance des données
    Réponses: 5
    Dernier message: 10/09/2003, 14h55
  4. Modifications framework
    Par rgarnier dans le forum XMLRAD
    Réponses: 5
    Dernier message: 18/06/2003, 18h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo