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 :

C# custom event thread safe


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut C# custom event thread safe
    Bonjour à tous,

    Est ce qu'il existe un pattern ou un best practice pour mettre en œuvre des évènements thread-safe ?
    Dans l'idéal ce que je souhaiterai, c'est que lorsque le développeur s'abonne à un évènement qui se lance dans un autre thread, il n'ai pas besoin de se soucier de faire un methodeInvoker ou quelque chose de ce type de son côté.

    En gros je ne veux pas que le développeur soit amené à écrire ce genre de chose lorsque l'évènement se lance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    this.Invoke((MethodInvoker)delegate ()
    {
    });
    J'ai trouvé une astuce mais je recherche quelque chose de mieux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                            if (onRowLoaded.Target is System.Windows.Forms.Form)
                            {
                                if (((System.Windows.Forms.Form)onRowLoaded.Target).IsHandleCreated)
                                    ((System.Windows.Forms.Form)onRowLoaded.Target).Invoke(onRowLoaded, new object[] { iNbRecordIndex, iNbFindRecord });
                            }else onRowLoaded(gtmClient, iNbRecordIndex, iNbFindRecord);
    Des pistes ?

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    La méthode la plus simple que je vois pour que cela soit transparent au niveau du développeur qui écrit le gestionnaire, c'est d'implémenter spécifiquement l'évènement en lui-même, en précisant les actions add et remove.

    Dans le add, l'idée serait de ne pas utiliser directement le delegate, mais de le décorer et que ce décorateur se charge de faire l'invocation si nécessaire.

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2004
    Messages
    477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 477
    Par défaut
    je pense en effet que dans le add il faudrait faire quleque chose. Mais quoi ? Stocker le control à l'origine de l'appel ... mais comment ? Sachant que je souvaite également qu'un développeur utilise ces évènements dans du code ou des applications console sans GUI.

  4. #4
    Membre éprouvé Avatar de WDKyle
    Homme Profil pro
    Analyste-Programmeur
    Inscrit en
    Septembre 2008
    Messages
    1 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-Programmeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 1 204
    Par défaut
    Bonjour,

    J’utilise une fonctionnalité de Prism qui est l’EventAggregator. Et avec lui on peux décider de recevoir la notification des événements depuis un thread secondaire ou depuis le thread principal.

    Est-ce que cela pourrait cous convenir ?

    https://prismlibrary.com/docs/event-aggregator.html

  5. #5
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    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 202
    Par défaut
    de mémoire la réponse est dans le code source de la classe backgroundworker
    https://referencesource.microsoft.co...d60b0d93a826fa


    la version simple (mais moins propre) c'est au moment de lever l'event, tu checks si openforms[0].InvokeRequired (en winform du moins, en wpf on peut tester si le app.current.dispatcher.thread == thread.current ou pas)
    auquel cas tu fais openforms[0].invoke
    ceci suppose qu'il y a toujours au moins une fenetre d'ouvertes, et qu'elles sont toutes sur le meme thread (l'inverse étant rare)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [RCP] Treeviewer non thread-safe ?
    Par Guildux dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 09/01/2007, 13h00
  2. Code "Thread Safe" ?
    Par Neitsa dans le forum C++
    Réponses: 3
    Dernier message: 23/12/2005, 14h33
  3. [Language]Immutable & Thread-Safe
    Par Repti dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 21/12/2005, 15h50
  4. [MFC] CMAP non thread safe ?
    Par fmarot dans le forum MFC
    Réponses: 5
    Dernier message: 04/10/2005, 13h21
  5. Custom Event Set
    Par toure32 dans le forum JBuilder
    Réponses: 1
    Dernier message: 26/08/2005, 12h03

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