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 :

[Threading] Dispatcher.BeginInvoke et Callback sur le même thread


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut [Threading] Dispatcher.BeginInvoke et Callback sur le même thread
    Bonjour,

    J'appelle depuis le thread principal une méthode d'un 1er object en fournissant une callback (la méthode fait un traitement synchrone).
    Le traitement se termine dans un object de type ContentControl : j'utilise alors le Dispatcher de cet objet pour executer la callback de manière asynchrone via le BeginInvoke.
    La callback est effectivement appelée de manière asynchrone.

    Par contre, en tracant les thread IDs, je m'apercois que la callback est appelée dans le même thread (thread principal).
    Cela me pose problème car je voudrais me synchroniser sur le retour de la callback (en utilisant un ManualResetEventSlim) : si je fait un Wait cela bloque le thead principal.

    Comment je peux attendre le retour de la callback sans bloquer le thread ?

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    C'est compliqué de savoir ce que tu veux faire.
    BeginInvoke exécutera le Callback dans le thread ayant crée le Control. C'est utile pour mettre à jour le GUI notamment. Il est donc normal qu'il soit exécuté dans le thread principal si le control a été crée dans celui-ci.
    Pour répondre au mieux, je pense qu'il faudrait en savoir un peu plus sur ce que fait le Callback et en quoi consiste cette synchronisation.

    eb.

  3. #3
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    tu peux utiliser un thread classique (system.threading.thread) plutot que de passer par begininvoke
    l'appel du callback par callback.invoke sera sur ce thread
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Par défaut
    Bonjour,

    Effectivement dans ce cas ce n'est pas une CallBack que tu veux utiliser mais un EndInvoke.

    Le BeginInvoke va appeler dans un autre Thread (Via ThreadPool et je te passe les détails) le traitement voulu, quand tu veux te synchroniser avec ce fameux thread tu dois utiliser EndInvoke, qui va attendre la fin de l'invocation.

    Ref: http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx

    Je ne sais pas ce que tu veux faire exactement, mais cette façon de faire est à utiliser dans certain cas.

    Le BeginInvoke + CallBack est intéressant dans le cas d'un traitement que la GUI a besoin de faire (comme des calculs, ou autres) et que tu ne veux pas bloquer le Thread de la GUI (pour des questions de fluidité). Tu vas donc utiliser un autre Thread pour laisser le Thread de la GUI travailler en paix et la CallBack va tout naturellement retravailler pour mettre à jour la GUI dans le Thread de la GUI, car il va de soit qu'une GUI ne peut être mise à jour uniquement par le Thread de la GUI.

    Je ne connais pas ton problème mais l'utilité de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    monDelegate.BeginInvoke(...,...,);
    monDelegate.EndInvoke(....)
    c'est 0, autant faire Invoke directement. J'ai déjà vu ça quelque part ... ça servait de cache misère, dans le cas d'un crash sur le thread appelé et bien ça ne crashe pas ton application car l'exécution est dans un Thread non principale.

    En C# on peut utiliser de beaucoup de manière les Threads, mais ils n'ont pas fait toutes ces possibilités pour remplir une liste de Feature permettant de faire beau, mais il y a bien une utilité à chaque manière, avec des avantages et des inconvénients. Le plus dur est donc de savoir lequel utilisé et quand

    Si tu veux, donne le context et peut être qu'on pourra t’éclairer sur une façon de faire peut être différente (du moins celle que chaque personne pense être la mieux).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Par défaut
    Merci pour vos explications.
    En fait, je n'avais pas compris que le BeginInvoke de Dispatcher exécute le Callback dans le thread ayant crée le Control...
    Par contre, ce que je ne comprend pas, c'est comment le code peut être executé de manière asynchrone tout en restant dans le même thread ?

Discussions similaires

  1. Réponses: 4
    Dernier message: 01/10/2013, 17h29
  2. 2 threads sur un même socket
    Par atmakefka dans le forum Réseau
    Réponses: 5
    Dernier message: 07/08/2010, 10h39
  3. Réponses: 4
    Dernier message: 21/05/2008, 16h30
  4. [Thread] deux joueurs sur le même clavier
    Par homeostasie dans le forum SDL
    Réponses: 16
    Dernier message: 04/11/2006, 15h30
  5. [CR6][CR8] cohabitation sur un même poste
    Par obi dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 27/11/2003, 20h24

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