2014-04-30 4 views
0

Je crée un programme qui trouve des fichiers en double dans un répertoire, mais lorsque le répertoire qu'il recherche contient trop de ces fichiers, il plante l'application. Je me demandais s'il y avait un moyen d'amortir la quantité de fichiers qu'il attrape. Voici le code qui fait la chose que je vous explique:L'ajout de nombreux éléments à la liste de sélection gèle l'interface utilisateur

string[] filePathsb = Directory.GetFiles(
     @"" + Dirfind, "*" + filetyperest, SearchOption.AllDirectories); 

for (int i = 0; i < filePathsb.Length; i++) 
    { 

    ListBoxItem itm = new ListBoxItem(); 

    try 
    { 
     List<TodoItem> items = new List<TodoItem>(); 

     filelistboxitem.Items.Add(new TodoItem() { Title = "" + filePathsb[i], Deletea = "" + i }); 
    } 
    catch (Exception ex) 
    { 
     System.Windows.Forms.MessageBox.Show("Error occurance: " + ex); 
    } 

} 

Juste une remarque: cela fonctionne très bien quand il y a environ 50 < fichiers.

+0

Define "planter l'application". L'ajout de 50 éléments, ou même 200, à une liste ne devrait pas causer de problèmes. L'ajout de milliers d'éléments à une zone de liste peut être un problème (en plus d'être une expérience utilisateur médiocre). Avez-vous une exception (détails?), Le programme se verrouille-t-il, ou quoi exactement? –

+0

Je ne reçois aucune exception de ce que je pense qu'il arrive quand je fais ceci: 'string [] filePathsb = Répertoire.GetFiles (@ "" + Dirfind, "*" + filetyperest, SearchOption.AllDirectories);' – andrew196

+0

de sorte que le blocage ne fait que geler la fenêtre lorsque j'exécute la fonction – andrew196

Répondre

3

WinForms peut devenir très lent et peu réactif si vous ajoutez de nombreux éléments à une zone de liste. Ceci est particulièrement vrai si, comme dans votre exemple, vous faites l'ajout à partir du fil de l'interface utilisateur. L'interface utilisateur gèlera jusqu'à l'ajout du dernier élément.

Que puis-je faire?

Une amélioration simple est d'appeler

SuspendLayout(); 

avant le début de votre boucle et

ResumeLayout(); 

après la boucle complète. Cela réduira le coût de mise à jour de la liste, de sorte que tout se termine plus rapidement.

Comment puis-je empêcher complètement le verrouillage de l'interface utilisateur?

Vous pouvez utiliser le filetage pour mettre à jour la liste en arrière-plan. Pour WinForms, BackgroundWorker est couramment utilisé. Notez que vous ne pouvez pas directement mettre à jour l'interface utilisateur à partir de BackgroundWorker, car ils s'exécutent sur des threads différents. Le mécanisme d'événement habituel ReportProgress ne s'applique pas dans cette situation, puisque vous souhaitez mettre à jour continuellement l'interface utilisateur jusqu'à ce que tous les fichiers soient chargés. Au lieu de cela, vous pouvez utiliser l'approche décrite ici:

Accessing UI Control from BackgroundWorker Thread

+0

qui semblait avoir accéléré merci beaucoup – andrew196

4

Essayez d'utiliser le fil BackgroundWorker pour trouver files.your UI ne gèle pas alors et le fichier logique de trouver fonctionnera en « fond »

Questions connexes