Inserer rapidement des lignes d'une DataTable dans une autre

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 17 janv. 2011 à 11:48
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 17 janv. 2011 à 15:25
Bonjour (je ne poste pas dans le thème base de donnée car ma question est indépendante d'un SGBD ),

Je crée actuellement une lecture de base de donnée (un SELECT) en multithreading.
En résumer j'ai 3 thread :
- Un pour l'affichage (dont je ne parlerais plus)
- Un pour lire page par page une table (qui ne me pose pas de problème)
- Un pour remplir une DataTable (houla aie bobo, c'est la que sa coince )

Mon objectif étant d'optimiser un maximum les lectures de base de données et de ne pas bloquer l'affichage.

Pour comprendre ce que je fait :
Mon thread de lecture lit une table page par page et insère les lignes lut dans une pile (objet Queue)

Mon thread d'insertion récupère ces lignes de la pile et les insèrent dans une datatable.
La méthode que j'utilise pour insérer les lignes est :
Dim LignesLut As System.Data.DataRowCollection
SyncLock PileLigne
    LignesLut =  PileLigne.Dequeue
End SyncLock
For Each Ligne As DataRow In LignesLut
    SyncLock Table
        Table.Rows.Add(Ligne.ItemArray)
    End SyncLock
Next


Sauf que c'est TRÈS TRÈS
lent

Existe t'il une méthode plus rapide pour faire ce genre de chose ?

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo

1 réponse

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
17 janv. 2011 à 15:25
Trouvé ,

Il faut simplement utiliser la propriété Merge :
SyncLock PileTable
    Table.Merge(PileTable.Dequeue)
End SyncLock


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
3
Rejoignez-nous