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 :

Modification d'une liste lors d'une itération


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut Modification d'une liste lors d'une itération
    Bonsoir
    Voici mon soucis : j'ai un serveur. Ce dernier stocke dans une liste tous les utilisateurs connectés.
    Un utilisateur envoie des données pouvant parfois être un peu lourdes au serveur et ce dernier envoie ces paquets à tous les autres utilisateurs.
    J'ai une fonction qui contient en gros :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (User user in UsersList)
    {
    //Envoi des données
    }
    Seulement si un utilisateur se déconnecte à ce moment là la liste est changée et le serveur plante. Comment puis-je améliorer ça ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Fais une copie de la liste avant d'énumérer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach (User user in UsersList.ToList())
    {
        //Envoi des données
    }
    Et ajoute un try/catch autour de l'envoi des données, au cas où un client qui était encore dans ta liste quand tu as commencé s'est déconnecté depuis

  3. #3
    Membre confirmé
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut
    C'est tellement bête et je n'y ai pas pensé !
    MErci beaucoup !

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tout bien réfléchi, ce n'est pas suffisant... la liste peut toujours être modifiée par un autre thread pendant l'exécution de ToList(). Pour bien faire, il faudrait faire un lock :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    List<User> users;
    lock(UserList)
    {
        users = UsersList.ToList();
    }
    foreach(User user in users)
    {
        //Envoi des données
    }
    Et bien sûr, pour que ça serve à quelque chose, il faut que le code qui modifie la liste fasse aussi ce lock...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void RemoveUser(User user)
    {
        lock(UsersList)
        {
            UsersList.Remove(user);
        }
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut
    Encore merci ! Ca par contre je n'y aurai pas pensé du tout !

  6. #6
    Membre confirmé
    Homme Profil pro
    Responsable de rayon
    Inscrit en
    Juin 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de rayon
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juin 2005
    Messages : 86
    Par défaut
    Une petite question subsidiaire :

    Est-ce que ça peut fonctionner si je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void fonction1()
    {
       lock(maliste)
       {
          fonction2(2);
       }
    }
    public void fonction2(int index)
    {
       maliste.RemoveAt(index);
    }
    ?
    Ou est-ce que le lock de la fonction 1 va bloquer la fonction 2 ? Les deux faisant partie du même thread cela ne devrait pas poser de problème, si ?

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

Discussions similaires

  1. [AJAX] liste liée a une liste liée a une liste
    Par dirty_harry dans le forum AJAX
    Réponses: 2
    Dernier message: 03/07/2009, 11h18
  2. modifier une liste contenue dans une liste
    Par harris_macken dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 18/03/2008, 16h52
  3. Réponses: 5
    Dernier message: 12/03/2008, 18h16
  4. acceder à une liste contenue dans une liste
    Par CPI_en_mousse dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 12/06/2007, 08h33
  5. remplir une liste à partir d'une liste
    Par LeXo dans le forum Access
    Réponses: 7
    Dernier message: 14/04/2006, 12h29

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