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 :

async Liste de contacts. un item passe à null.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut async Liste de contacts. un item passe à null.
    Bonjour,

    Je me retrouve avec un problème aléatoire.

    J'ai un traitement qui est fait durant un appel téléphonique.

    Une fois mon appel reçu, j'ai une instance de l'appel qui est fait et qui lance la recherche.
    pendant ce temps l'utilisateur peut décrocher et faire des manipulations

    La recherche effectue différentes requêtes sur plusieurs base / tables. l'interlocuteur à pu être en relation dans le passé avec nous à travers différentes applications.
    il est donc possible d'avoir plusieurs fois le contact (vendeur, acheteur, artisan, ...)
    du coup durant l'appel on va ouvrir les fiches en fonction de son type d'appel.

    donc la recherche de l'interlocuteur est fait de marnière asynchrone et dans l'évolution de l'appel téléphonique à un moment donné, j'associe mes résultats à un radListview.
    dans mon exemple de test, j'ai mis un numéro présent à 2 endroit, j'ai donc 2 contacts avec ce numéro, avec l'information d'où est issu le contact. je bind ma liste retourné à un RadListView.

    pas de soucis (j'ai du faire de la customisation via "SimpleListViewVisualItem/CreateChildElements") ma liste étant sous forme "Details" et donc j'ai un traitement sur les données suivant le binding en suivant un tutoriel Telerik.
    Sauf que par moment (aléatoire) sans comprendre pourquoi j'avais un plantage durant cette phase avec mon Data qui vaut null.
    après analyse de la pile d'appels j'ai vu que j'avais bien 2 contacts dans ma liste mais mon 2ème était à Null, ce que je ne comprend pas. Car j'ai un contrôle pour ne pas mettre de null dans ma liste de retour et surtout que j'ai bien eu 2 contacts à un moment donné pourquoi serait-il devenu "null"

    Voilà pour mon problème dont le debug est difficile et sans comprendre pourquoi d'un coup null ?

    Merci de votre aide


    Class "Appel" qui contient l'appel à la recherche du contact
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
     RechercheInterlocuteur(); // Appel de la fonction après instanciation de l'appel et les infos récoltés depuis "la ligne"
     
    private async void RechercheInterlocuteur()
            {...
    	        ContactRequest CR = new ContactRequest(Utils.TruncNumTelephone(numeroARechercher));
                    CR.SetRequestListInterrogation(Appels.PrepaDataSQL_Interlocuteurs);
     
                    ListOfContacts = new List<ContactInfosDataModel>();
                    await CR.RequestAsync(ListOfContacts);
    	...	
    	}
    Classe pour récupération des contacts
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    private List<ContactInfosDataModel> _ContactsResult ;
    public List<ContactInfosDataModel> Contacts
    {
          get { return _ContactsResult; }
          private set { _ContactsResult = value; }
    }
     
    public async Task RequestAsync(List<ContactInfosDataModel> lstContacts)
            {
                List<Task> Tasks = new List<Task>();
     
                foreach (RequestType rt in SQLInterrogation)
                {
                    Tasks.Add(Task.Run(() => GetRequestDatas(rt)));
                }
     
                await Task.WhenAll(Tasks); // Attends tout les résultat avant remonté
                lstContacts.AddRange(Contacts);
            }
     
    private void GetRequestDatas(RequestType request)
            {
                List<ContactInfosDataModel> results = null;
     
                switch (request)
                {
                    case RequestType.A:
                        results = RequestContactTypeA(Numero);
                        break;
                    case RequestType.B:
                        results = RequestContactTypeB(Numero);
                        break;
     
                    case RequestType.C:
                        results = RequestContactTypeC(Numero);
                        break;
     
                    case RequestType.D:
                        results = RequestContactTypeD(Numero);
                        break;
                }                        
     
                if (results != null) AjouteResultats(results);            
            }
     
            private void AjouteResultats(List<ContactInfosDataModel> resultats)
            {
                if (this.Contacts == null) { this.Contacts = new List<ContactInfosDataModel>(); };
                Contacts.AddRange(resultats);
            }

  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,

    Je pense que le problème est simplement un problème de concurrence. La liste dans this.Contact est une liste simple, qui n'est pas threadsafe. Soit il faut utiliser une collection threadsafe (cf. les classes dans System.Collections.Concurrent), soit il faut protéger l'accès à la liste de contact par un lock (mais tous les accès, y compris en lecture).

    Le plus simple ici me semble l'usage d'un ConcurrentBag, l'ordre n'ayant a priori aucune importance.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Par défaut
    Bonjour,

    Merci pour la réponse, je me suis posé aussi la question d'accès simultané.
    après je pense que pour la lecture il ne devrait pas y avoir de problème car j'ai le whenAll la lecture étant après, et j'ai aussi un boolean après la remonté dans RechercheInterlocuteurs me disant que les données ont été récoltés.
    si je mets le lock (pour en voir les effets faut que je tombe sur la simultanéité) l'instance qui veut ajouter les données, elle attends ? et retente quelques seconde après ?

    j'essaierais lundi en arrivant au travail en espérant pouvoir tomber dans le cas et voir si ça marche (enfin difficile de voir du coup ;-))

  4. #4
    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
    Effectivement, le lock va mettre en attente la tâche qui essaie d'accéder au code dans le lock, si une autre tâche est déjà en cours d'exécution dans cette même portion de code. Après, elle n'attend pas quelques secondes, elle attend juste que le lock se libère. Dès qu'il est libéré, elle peut reprendre son exécution. Si plusieurs tâches sont en attente, une seule d'entre elle pourra continuer son exécution, et lorsqu'elle aura terminée, une autre pourra prendre le relais et ainsi de suite.

    Si la lecture se fait après, dans ce cas, il n'y aura pas besoin de lock pour le lire. C'était dans le cas où lecture et écriture peuvent se faire de manière simultanée.

Discussions similaires

  1. recuperer liste utilisateurs et mot de passe
    Par pascale86 dans le forum Administration
    Réponses: 57
    Dernier message: 21/01/2008, 15h06
  2. [SOAP] Récupérer la liste des contacts
    Par amika dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 16/01/2007, 00h23
  3. Comment accéder à la liste des contacts
    Par Akira dans le forum Java ME
    Réponses: 7
    Dernier message: 06/11/2006, 14h59
  4. Réponses: 7
    Dernier message: 27/10/2005, 15h03
  5. Comment récupérer la liste des contacts de outlook express?
    Par arnaud_verlaine dans le forum Outlook Express / Windows Mail
    Réponses: 6
    Dernier message: 12/10/2004, 15h53

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