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

Dotnet Discussion :

Task et synchronisation du thread UI


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut Task et synchronisation du thread UI
    Bonjour,

    Développant en .Net 4.0 j'en profite pour tester les nouvelles classes et remplacer l'utilisation de la classe Thread par la classe Task. Je me confronte tout de même a un petit soucis technique, la synchronisation par rapport a la "Task" de WPF.

    J'ai une fonction qui notifie la réception d'un nouveau fichier et qui envoi le résultat dans ma vue WPF :

    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
     
     private void NewFileReceived(string path)
    {
                ThreadPool.QueueUserWorkItem(s =>
                {
                    ICAD_RxxMessage doc = this.DocumentConvertion(s as string);
                    if (doc != null)
                    {
                        //Return to principal thread    
                      App.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Background,
                         new Action(() =>
                                  {
                                      OnDocumentNF399Receiving(doc);
                                  }
                         ));
                    }
                }, path)
    }
    Le délégué OnDocumentNF399Receiving envoi le résultat ensuite dans ma vue WPF.
    Et je voudrais le remplacer par un code de ce genre la :

    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
     
    private void NewFileReceived(string path)
    {
             Task<ICAD_RxxMessage> result = Task.Factory.StartNew<ICAD_RxxMessage>(s =>
                           {
                               ICAD_RxxMessage doc = this.DocumentConvertion(s as string);                          
                               return doc;
     
                           }, path,TaskCreationOptions.PreferFairness);
                    result.ContinueWith((task) =>
                    {
                        if (result.Result != null)
                        {
                            OnDocumentNF399Receiving(result.Result);
                        }
                    } );
    }


    Une exception est remonte car le contexte de synchronisation n'est pas le même.
    Suis je oblige de demande à ma vue son contexte à travers un accesseur qui me renverrais le resultat de TaskScheduler.FromCurrentSynchronizationContext(), ou y a t'il un moyen simple ou une "bidouille" tel qu'il existe pour les Thread avec l'utilisation du Dispatcher ?

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Je ne connais pas d'autres moyens. Il y en a peut-être d'autres, mais c'est probablement du chipotage.

  3. #3
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    ok ok, merci pour ta confirmation GuruMeditation effectivement je n'ai pas trouve une autre solution, je continu quand même à regarder.

    Merci

  4. #4
    Membre émérite Avatar de worm83
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Février 2010
    Messages
    459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2010
    Messages : 459
    Par défaut
    La solution que j'ai retenu c'est de garder le deuxième code et de republier dans le thread principal à l'aide du dispatcher lorsque je créé mon ViewModel, un hybride de l’ancienne et de la nouvelle méthode quoi ^^.

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

Discussions similaires

  1. question: Synchronisation de threads
    Par remimichot dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 23/07/2006, 18h27
  2. Question sur la synchronisation des threads.
    Par sebastieng dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 07/12/2005, 15h55
  3. Réponses: 1
    Dernier message: 23/05/2005, 15h52
  4. Synchronisation de thread
    Par declencher dans le forum Langage
    Réponses: 2
    Dernier message: 07/01/2004, 10h28

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