2010-11-01 2 views
1
private void Form1_Load(object sender, System.EventArgs e) 
{ 
    StartToFillTree(); 
} 

private void StartToFillTree() 
{ 
    try 
    { 
     tvFolders.Nodes.Clear(); 
     tvFolders.Nodes.Add(new TreeNode("Loading", -1, -1)); 

     Thread explorerThread = new Thread(new ThreadStart(FillTreeInAnotherThread)); 
     explorerThread.Start(); 
    } 
    catch (Exception exc) 
    { 
     //Do the catch 
    } 
} 

private void FillTreeInAnotherThread() 
{ 
    try 
    { 
     CreateTree(this.tvFolders); 
    } 
    catch (Exception exc) 
    { 
     //Do the catch 
    } 
} 


public void ClearTreeview(TreeView tv) 
{ 
    tv.Nodes.Clear(); 
} 

public void AddNodeToTreeview(TreeView tv, TreeNode node) 
{ 
    tv.Nodes.Add(node); 
} 

public void CreateTree(TreeView treeView) 
{ 
    try 
    { 
     TreeNode hoofdNode = new TreeNode("NodeNam", 0, 0); 
     AddDrivesToHoofdNode(hoofdNode); //This method takes 1 ms 

     //This part takes 905 milliseconds if I can believe my profiler !!?? ----- 
     if(treeView.InvokeRequired) 
     { 
      treeView.Invoke(new ClearTreeviewDelegate(this.ClearTreeview), new object[] { treeView }); 
      treeView.Invoke(new AddNodeToTreeviewDelegate(this.AddNodeToTreeview), new object[] { treeView, hoofdNode }); 
     } 
     else 
     { 
      treeView.Nodes.Clear(); 
      treeView.Nodes.Add(hoofdNode); 
     } 
     //End of 900ms part ?? ----- 


     AddFavorieteFolders(treeView);//This method takes 1 ms 

    } 
    catch (Exception ex) 
    { 
     //Do some catching 
    } 
} 
+3

Pourquoi avez-vous des blocs de prises vides? C'est une mauvaise pratique. Mieux vaut ne pas attraper une exception que de l'avaler silencieusement. – Oded

+1

J'attrape les erreurs, mais juste enlevé le code pour faciliter la lecture ici :-) –

Répondre

3

Tout d'abord, pourquoi utilisez-vous des threads pour quelque chose d'aussi simple? Il a l'air un peu sur-conçu. Mais vous ne nous montrez peut-être pas tout?

enveloppent également les modifications TreeView avec:

treeView.BeginUpdate(); 
// modify the tree here. 
treeView.EndUpdate(); 

Pour obtenir de meilleures performances.

+0

Vous avez raison ... Je commençais un autre thread pour ajouter 1 nœud à un treeview .. :-) un peu trop :-) (il avait grandi au fil des années) ... Il faut maintenant 1 ms pour terminer. Merci. –

+0

np. arrive le meilleur de nous;) – jgauffin

8

Vous ne pouvez pas mettre à jour les composants de l'interface utilisateur en dehors du thread d'interface utilisateur. Tous ces appels Invoke remettent les mises à jour dans le thread de l'interface utilisateur, ce qui permet de sérialiser à nouveau votre application.

Une approche typique des grands arbres consiste à charger uniquement les nœuds enfants lorsque le parent est développé plutôt que d'essayer de remplir tout l'arbre au début.

+0

Vous avez raison. J'ai enlevé le fil supplémentaire. Merci. –

3

InvokeRequired prend du temps pour faire son travail. Voir this. Spécialement "Si le handle du contrôle n'existe pas encore, InvokeRequired recherche la chaîne parente du contrôle jusqu'à ce qu'il trouve un contrôle ou un formulaire qui possède un handle de fenêtre Si aucun descripteur approprié ne peut être trouvé, la méthode InvokeRequired retourne false." Cela prend donc du temps

+0

Merci pour la référence. –

2

Appelez-vous BeginUpdate sur votre contrôle TreeView avant de supprimer et d'ajouter de nouveaux nœuds, puis d'appeler EndUpdate lorsque vous avez terminé d'ajouter des nœuds? Si vous ne faites pas ces appels, votre TreeView essaiera de se repeindre après chaque nœud ajouté - manquant cela peut faire que le code qui est autrement très bien fonctionner extrêmement lentement, en particulier lorsque vous ajoutez un grand nombre de nœuds.

+0

Merci pour le point. Astuce très utile – fedotoves

+0

Oublié cela aussi. Merci pour le conseil. –

Questions connexes