Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Inserimento di elementi in listView in background
Forum - C# / VB.NET - Inserimento di elementi in listView in background

Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:52
Giovedì, 11/04/2013
Salve.
All'avvio di un applicazione mi trovo a recuperare dei file da una cartella analizzarli e successivamente porli in un ListView. Il processo viene compiuto su centinaia di elementi che ritardano di molto l'apertura del form quindi ho pensato di aspettare il caricamento del form prima di lanciare la funzione di caricamento dei file, effettivamente il tempo di caricamento del form viene ridotto in modo significativo. L'unico problema consiste nel fatto che il form fino alla fine del caricamento dei file non puo rispondere ad altre interazioni, infatti al solo click esso entra in stato "Not Responding". Pensavo di avviare il processo di caricamento dei file in un thread separato ma trovandomi sul form principale non riesco ad eseguire la funzione con questo codice:
Codice sorgente - presumibilmente C# / VB.NET

  1. private void Main_Shown(object sender, System.EventArgs e)
  2.         {
  3.             Thread loadMusic = new Thread(new ThreadStart(this.loadMusic));
  4.  
  5.             loadMusic.Start();
  6.         }


Ricevendo eccezione {"L'insieme è stato modificato. L'operazione di enumerazione potrebbe non essere eseguita."} sulla funzione dispose del form
Mi potreste aiutare a risolvere...
Grazie

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 18:44
Giovedì, 11/04/2013

Usa un BackgroundWorker  :yup:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:36
Giovedì, 11/04/2013
Ok grazie, sono tante le funzionalità che non so neanche esistano in c#
Ho provato, riesco ad avviare il lavoro ma mi viene generata ancora l'eccezione...
Vi posto il codice che uso
Codice sorgente - presumibilmente C#

  1. public void loadMusic()
  2.         {
  3.             betterMusicList.Items.Clear();
  4.             betterMusicList.Groups.Clear();
  5.             string path = "M:\\Audio\\Musica\\";
  6.             string[] files = Directory.GetFiles(path, "*.mp3");
  7.             foreach (string file in files)
  8.             {
  9.                 TagLib.File tagFile = TagLib.File.Create(file);
  10.                 string artist = (tagFile.Tag.FirstAlbumArtist==null?"(Sconosciuto)":tagFile.Tag.FirstAlbumArtist);
  11.                 Artist.artists[Artist.artistId(artist)].addSong(file, tagFile.Tag.Album, tagFile.Tag.Track.ToString(), tagFile.Tag.Title);
  12.             }
  13.  
  14.             foreach (Artist artist in Artist.artists)
  15.             {
  16.                 artist.listViewGroup = new BetterListViewGroup();
  17.                 artist.listViewGroup.Header = artist.name;
  18.                 artist.listViewGroup.Name = artist.name;
  19.                 foreach (Song song in artist.songs)
  20.                 {
  21.                     song.listViewItem = new BetterListViewItem(new string[] { song.album, song.track, song.title, song.file });
  22.                     song.listViewItem.Group = artist.listViewGroup;
  23.                     betterMusicList.Items.Add(song.listViewItem);
  24.                 }
  25.                 betterMusicList.Groups.Add(artist.listViewGroup);
  26.             }
  27.         }
  28.  
  29.         private void Main_Shown(object sender, System.EventArgs e)
  30.         {
  31.             BackgroundWorker backgroundLoad = new BackgroundWorker();
  32.             backgroundLoad.DoWork += backgroundLoad_DoWork;
  33.             backgroundLoad.RunWorkerAsync();
  34.         }
  35.  
  36.         private void backgroundLoad_DoWork(object sender, DoWorkEventArgs e)
  37.         {
  38.             loadMusic();
  39.         }


Non capisco perché il dispose sia interessato dal mio codice...

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 11:16
Venerdì, 12/04/2013

Crei delle modifiche non consentite :yup:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:48
Venerdì, 12/04/2013
Testo quotato

Postato originariamente da Ultimo:


Crei delle modifiche non consentite :yup:



uhm.. ah... Potresti essere un po più dettagliato per favore.

Edit:
Ho rinunciato al componete ListView personalizzato con un ListView classico... Ho risolto impostando il lavoro in background in modo che esso deleghi le modifiche del componente al thread principale

Ultima modifica effettuata da Roby94 il 13/04/2013 alle 16:15
PM Quote