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:
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:
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);
} |