Bonjour,
Je viens vers vous pour avoir des conseils sur l'utilisation des tâches en C#.
Dans une appli où je dois faire du traitement de masse, j'ai une datagrid avec en première colonne une icône qui indique quel élément est en cours de traitement.
Le mode opératoire souhaité est le suivant :
- Ma première ligne est traitée, mon icône prend la forme d'un gif animé de chargement,
- J'appelle ma tâche pour traiter mon enregistrement sans figer l'écran,
- Selon le résultat, la tâche doit mettre à jour la ligne (icône qui prend une forme différente selon le succès ou l'échec de la tâche),
- Passage à la ligne suivante.
Je fais donc une boucle pour parcourir mon datagrid :
Et dans ma tâche, j'ai le code suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 for (int i = 0; i < datagrid.Rows.Count; i++) { [...] Task.Factory.StartNew(() => { return matache(rowIndex, values); }); }
En opérant comme ça j'ai plusieurs problèmes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public async Task matache(int rowIndex, Dictionary<string, string> values) { [...] datagrid.BeginInvoke(new Action(() => { ((DataGridViewImageCell)datagrid[0, rowIndex]).Value = Resources.monimage; } }
- Les tâches ne s'exécutent pas les unes après les autres (je comprends pourquoi même si ça m'embête),
- mon "rowIndex" dans ma tâche matache() se retrouve parfois avec une valeur hors limite car, de ce que je comprends, même si ma tâche est lancée, mon rowIndex continue à évoluer dans la boucle for()
Que feriez-vous à ma place ? Quelles sont vos façons d'opérer ?
Si vous avez des liens d'exemple ou du code dont je pourrais m'inspirer afin de maitriser ce système de tâche, ça me serait d'une grande aide !
Merci pour vos retours
Partager