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 :

PipeStream en C# pour communication inter-threads ?


Sujet :

Dotnet

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut PipeStream en C# pour communication inter-threads ?
    Bonjour,

    Y a-til une classe .NET permettant d'avoir un Stream partagé entre 2 threads
    - un qui écrit des données
    - un qui lit les données

    .. ce qui se fait en Java de cette manière

    pin = new PipedInputStream();
    pout = new PipedOutputStream((PipedInputStream)pin);



    Merci

  2. #2
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,
    presque la même chose :
    • AnonymousPipeServerStream / AnonymousPipeClientStream
    • NamedPipeServerStream / NamedPipeClientStream


    Ces streams sont utilisables pour des communications interprocess, donc valable également pour des communications interthreads.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    J'avais effectivement vu ces classes mais cela me paraissait lourd ?
    Je vais essayer

    Merci

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tout peut être partagé entre 2 threads, je ne vois pas pourquoi il faudrait quelque chose de spécial
    même un event ca conviendrait surement
    dans le pire des cas quelque chose avec un lock
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Des accès concurrents nécessitent des précautions d'usage. Sinon, c'est une source de bogue plus ou moins fréquent extrêmement difficile à diagnostiquer.

    Pour un stream, il faut quelque chose de spéciale, car les flux de lecture et d'écriture ne vont pas évoluer de la même manière. Même si on a un stream qui est à la fois accessible en lecture et en écriture (comme MemoryStream), mélanger une opération de lecture avec une d'écriture (sans même parler d'accès concurrents), c'est le meilleur moyen d'avoir un bazar monstre, car la lecture du flux va modifier la position courante, qui ne sera plus bonne pour l'écriture et vice-versa. Et dans le cas d'accès concurrents, un lock seul ne suffira pas, d'où la nécessite d'avoir une structure particulière.

    Après, c'est un problème "classique" de producteur / consommateur. Est-ce que le stream est le plus adéquat ici ? Aucune idée, puisqu'on ne sait pas la nature des données qui transitent par le flux. Mais cette question sort du cadre de cette discussion.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Voici les tests que je viens de réaliser.
    Le second test ne fonctionne pas... avez vous une piste ?

    Le but final est de rendre disponible ce qui est lu du serveur SSH comme input pour un autre traitement (CopyTo par exemple)


    Ce premier test fonctionne sans les pipes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    using (MemoryStream o = new MemoryStream())
                {                
                    using (SftpFileStream pin = client.OpenRead("/toto/fichier.txt"))
                    {
                        pin.CopyTo(o);
                    }
                    byte[] res = o.ToArray();
                }
    Ce second exemple ne fonctionne pas, cela bloque au niveau du Join.
    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
     
    using (AnonymousPipeServerStream pipein = new AnonymousPipeServerStream(PipeDirection.In))
                {
                    using (AnonymousPipeClientStream pipeout = new AnonymousPipeClientStream(PipeDirection.Out,
                        pipein.GetClientHandleAsString()))
                    {
                        byte[] res;
                        Thread t = new Thread(() =>
                        {
                            using (MemoryStream x = new MemoryStream())
                            {
                                pipein.CopyTo(x);
                                res = x.ToArray();
                            }
                        });
                        t.Start();
     
                        using (SftpFileStream pin = client.OpenRead("/toto/fichier.txt"))
                        {
                            pin.CopyTo(pipeout);
                        }
     
                        t.Join();
                    }
                }
    client vient de la lib SSH.net

    Merci

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Voici un exemple plus simple qui ne fonctionne pas
    Avez-vous une idée ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Console.WriteLine("> " + text2);
    n'est jamais appelé
    Cela bloque au niveau du Join

    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
    using (AnonymousPipeServerStream pipeout = new AnonymousPipeServerStream(PipeDirection.Out))
                {
                    using (AnonymousPipeClientStream pipein = new AnonymousPipeClientStream(PipeDirection.In,
                        pipeout.GetClientHandleAsString()))
                    {
     
                        byte[] res;
                        Thread t = new Thread(() =>
                        {
                            using (MemoryStream x = new MemoryStream())
                            {
     
                                pipein.CopyTo(x);
                                res = x.ToArray();
                                string text2 = Encoding.UTF8.GetString(res);
                                Console.WriteLine("> " + text2);
     
     
                            }
                        });
                        t.Start();
     
                        string text = "hello !";
                        using (MemoryStream x = new MemoryStream(Encoding.UTF8.GetBytes(text)))
                        {
                            x.CopyTo(pipeout);
                        }
     
     
                        t.Join();
                    }               
                }

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    peut tu détailler un peu ce que tu veux faire transiter ? juste des strings ? des instances de classes contenant des données typées ?
    c'est un truc sans fin (qui peut écrire plein de choses n'importe quand et chaque chose doit être traitée au fur et à mesure par une autre portion de code ?) ou juste une fois ?
    ce sont 2 classes qui sont des threads différents ? des threads qui while true ?
    y a 50 moyens de faire ça simplement, on va bien t'en trouver un ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Le problème vient de l'usage de CopyTo. CopyTo copie des informations tant que le stream est ouvert. Ici, rajouter un pipeout.Close() fermera le flux après y avoir écrit, permettant au reste du programme de tourner correctement.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    C'est effectivement ce que j'avais vu.
    Merci

Discussions similaires

  1. Communication inter-threads par stdout sous linux
    Par millerf dans le forum Concurrence et multi-thread
    Réponses: 8
    Dernier message: 17/07/2007, 11h28
  2. Réponses: 4
    Dernier message: 15/06/2007, 10h41
  3. Communication inter-threads: methode elegante?
    Par jc_isd dans le forum C++
    Réponses: 10
    Dernier message: 17/01/2007, 10h55
  4. [c#]Communication inter thread
    Par chasse dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/12/2006, 20h45
  5. communication inter-thread en c sous linux
    Par splinternabs dans le forum POSIX
    Réponses: 17
    Dernier message: 22/02/2006, 09h34

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