Oppure

Loading
11/04/13 15:52
Roby94
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:
        private void Main_Shown(object sender, System.EventArgs e)
        {
            Thread loadMusic = new Thread(new ThreadStart(this.loadMusic));

            loadMusic.Start();
        }

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
aaa
11/04/13 16:44
Ultimo

Usa un BackgroundWorker :yup:
If ok Then GOTO Avanza else GOTO Inizia

11/04/13 17:36
Roby94
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
        public void loadMusic()
        {
            betterMusicList.Items.Clear();
            betterMusicList.Groups.Clear();
            string path = "M:\Audio\Musica\";
            string[] files = Directory.GetFiles(path, "*.mp3");
            foreach (string file in files)
            {
                TagLib.File tagFile = TagLib.File.Create(file);
                string artist = (tagFile.Tag.FirstAlbumArtist==null?"(Sconosciuto)":tagFile.Tag.FirstAlbumArtist);
                Artist.artists[Artist.artistId(artist)].addSong(file, tagFile.Tag.Album, tagFile.Tag.Track.ToString(), tagFile.Tag.Title);
            }

            foreach (Artist artist in Artist.artists)
            {
                artist.listViewGroup = new BetterListViewGroup();
                artist.listViewGroup.Header = artist.name;
                artist.listViewGroup.Name = artist.name;
                foreach (Song song in artist.songs)
                {
                    song.listViewItem = new BetterListViewItem(new string[] { song.album, song.track, song.title, song.file });
                    song.listViewItem.Group = artist.listViewGroup;
                    betterMusicList.Items.Add(song.listViewItem);
                }
                betterMusicList.Groups.Add(artist.listViewGroup);
            }
        }

        private void Main_Shown(object sender, System.EventArgs e)
        {
            BackgroundWorker backgroundLoad = new BackgroundWorker();
            backgroundLoad.DoWork += backgroundLoad_DoWork;
            backgroundLoad.RunWorkerAsync();
        }

        private void backgroundLoad_DoWork(object sender, DoWorkEventArgs e)
        {
            loadMusic();
        }

Non capisco perché il dispose sia interessato dal mio codice...
aaa
12/04/13 9:16
Ultimo

Crei delle modifiche non consentite :yup:
If ok Then GOTO Avanza else GOTO Inizia

12/04/13 12:48
Roby94
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 13/04/13 14:15
aaa