Salut,
Soit une tâche statique "public static async Task<ObservableCollection<Pt>> ImportPointAsync(int srid, string mdbPath, IProgress<int> progress)"
Cette tâche crée des points suite à la lecture de 2 tables.
Comment fonctionne-t-elle actuellement ? Elle commence par charger les tables dans 2 DataTables puis, ligne par ligne, crée les points.
La tâche fonctionne, mais vous comprenez que créer un par un plus de 60 000 point prend un peu de temps.
Voici la partie de code qui m'intéresse (que je voudrais améliorer) :
Que voudrais-je faire ? Paralléliser la création de points, mais c'est là que je coince depuis plusieurs jours et donc que je fais appel à vous.
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 ObservableCollection<Pt> points = new ObservableCollection<Pt>(); int totalCount = dtPoints.Rows.Count; int processCount = await Task.Run<int>(() => { int count = 0; foreach (DataRow drPoint in dtPoints.Rows) { if (drPoint != null) { DataRow[] drsPCodes = dtPCodes.Select("IdPoint = " + drPoint["IdPoint"]); List<int> lstPCodes = new List<int>(); foreach (DataRow drPCode in drsPCodes) { int pcode = 0; if (drPCode != null && int.TryParse(drPCode["PCode"].ToString(), out pcode)) lstPCodes.Add(pcode); } Pt newPoint = new Pt(drPoint["nomPoint"].ToString(), (double)drPoint["PointX"], (double)drPoint["PointY"], lstPCodes, srid); if (newPoint != null && !points.Contains(newPoint)) points.Add(newPoint); } if (progress != null) { progress.Report((count * 100 / totalCount)); } count++; } return count; }); if (points != null && points.Count > 0) return points; return null;
J'avais pensé à faire une liste des taches dont chaque tâche créerait 1000 points. Si déterminer les index de départ et de fin de lecture pour chaque tâche parallèle ne pose pas de problème (mais est-ce vraiment la meilleure solution ?), je voudrais que la tâche de base (ImportPointAsync) retourne la progression globale (en calculant le nombre de points créés en fonction du nombre de points que chaque tâche devrait retourner (comment faire cela et le gérer ?) et du total des lignes de la table dtpoints).
Merci de vos z'avis z'avisés.
Partager