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

C# Discussion :

Traitement asynchrone d'un évènement


Sujet :

C#

  1. #1
    Membre habitué Avatar de i.chafai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Décembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 117
    Points : 167
    Points
    167
    Par défaut Traitement asynchrone d'un évènement
    Bonjour,

    J'ai un traitement dans mon application qui se résume dans le code en dessous
    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
    this.Cursor = Cursors.WaitCursor;
     
                txt_log_Traitement.Text = DateTime.Now + " - Début vérification structures ...";
                txt_log_Traitement.Text += "\n";
     
                DataTable DT_Article = new DataTable();
                DT_Article.Clear();
     
                F_ARTICLE.VerifExistanceArticle(DT_Article, _do_piece, _typedoc, _base_origine, _base_cible);
                txt_log_Traitement.Text += DateTime.Now + " - Nombre d'articles inexistants : " + DT_Article.Rows.Count.ToString();
                txt_log_Traitement.Text += "\n";
     
                DataTable DT_Famille = new DataTable();
                DT_Famille.Clear();
                F_FAMILLE.Get_FamilleInexistante(DT_Famille, _do_piece, _typedoc, _base_origine, _base_cible);
                txt_log_Traitement.Text += DateTime.Now + " - Nombre de familles inexistantes : " + DT_Famille.Rows.Count.ToString();
                txt_log_Traitement.Text += "\n";
     
                txt_log_Traitement.Text += DateTime.Now + " - Fin vérification structures ...";
                txt_log_Traitement.Text += "\n";
     
                if (DT_Article.Rows.Count > 0 || DT_Famille.Rows.Count > 0)
                {
                    Moulinette.GenerationDocument.Form1 f = new Form1(DT_Article, DT_Famille);
                    f.Show();
                    txt_log_Traitement.Text += DateTime.Now + " - Fin de traitement ...";
                }
                else
                    InsertionDocument();
    Le problème est que la saisie dans le contrôle txt_log_Traitement ne se fait qu'après tous le traitement est terminé. Est ce qu'il existe une solution pour qu'a chaque fin de traitement le texte s'affiche et après il passe au traitement suivant, sans attendre la fin de tout le traitement pour avoir un affichage.
    Peut être il faut utiliser les Thread, mais je n'ai jamais utilisé. J'ai essayé d'utiliser Thread.CurrentThread.Suspend(); et Thread.CurrentThread.Resume(); mais un message d'erreur s'affiche au niveau de Thread.CurrentThread.Suspend();

    Merci par avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Il faut tout d'abord savoir une chose très importante à propos des threads : il ne faut surtout pas faire appel à un élément d'IHM à partir d'un thread secondaire.

    Après je te déconseille très vivement d'utiliser des méthodes telles que "Thread.Suspend" ou "Thread.Resume" qui sont très risquées.

    Si tu es en Framework 4.5, regarde attentivement ce fil de discussion où quelqu'un voulait faire aussi le même genre de chose. Ne t'arrête pas aux premiers posts toutefois.

  3. #3
    Membre habitué Avatar de i.chafai
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Décembre 2012
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2012
    Messages : 117
    Points : 167
    Points
    167
    Par défaut
    Bonjour,
    Merci bien pour votre retour.
    Je suis sur .Net 4.0

  4. #4
    Invité
    Invité(e)
    Par défaut
    OK alors.

    Sur .NET 4.0 il existe au moins la classe "Task". Tu devrais dans ce cas vraiment privilégier cette classe plutôt que la classe "Thread".

    Cela va être un peu plus compliqué qu'en v 4.5 pour gérer les exceptions mais c'est quand même faisable.

    Je n'ai pas trop le temps de redonner un petit cours sur les tâches mais l'idée c'est ça :

    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
    void Test()
    {
        //Ici on est dans le thread principal, càd celui de l'IHM
        txt_log_Traitement.Text = DateTime.Now + " - Début vérification structures ...";
        txt_log_Traitement.Text += "\n";
     
        //Ceci va lancer une tâche asynchrone
        Task tsk = Task.Factory.StartNew(()=>
        {
              //Un traitement long que tu veux
        });
     
        //On va arriver tout de suite ici pour être sûr que ce sera fait à la suite :
        Task tsk2 = tsk.ContinueWith(tsk1 => {
           txt_log_Traitement.Text += "\n";
        }, TaskContinuationOptions.ExecuteSynchronously); //Grâce à "ExecuteSynchronously, ça se fera sur le thread de l'IHM
     
    }
    Au fait, si tu ne connais pas les expressions lambda ou les délégués, il faut impérativement que tu te formes dessus.
    Même si tu n'es pas en Framework 4.5, regardes quand même le fil de discussion que je t'ai montré.

Discussions similaires

  1. Reponse instantanée traitement asynchrone
    Par natoine dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 15/04/2009, 12h06
  2. Réponses: 4
    Dernier message: 04/12/2008, 20h46
  3. [Stratégie] Traitement asynchrone suite à la validation d'un formulaire web
    Par El Saigneur dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 01/10/2008, 21h53
  4. Recherche Framework pour traitement asynchrone
    Par kisitomomotene dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 02/06/2008, 17h59
  5. Réponses: 7
    Dernier message: 04/09/2006, 14h17

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