private void ScanDirectory(object basePathObject) { int totalFiles = 0; ObservableCollection<Track> trackList = new ObservableCollection<Track>(); try { string basePath = (string)basePathObject; DirectoryInfo di = new DirectoryInfo(basePath); FileInfo[] fileList = di.GetFiles("*.mp3", SearchOption.AllDirectories); totalFiles = fileList.Length; for (int i = 0; i < totalFiles; i++) { if (_cancelScanning) { totalFiles = i; break; } IID3v2Tag id3 = new ID3v2Tag(fileList[i].FullName); Track track = new Track { Artist = id3.Artist, Title = id3.Title, Album = id3.Album, Year = id3.Year, Genre = id3.Genre, FullFileName = fileList[i].FullName }; if (id3.PictureList != null && id3.PictureList.Count > 0) { IAttachedPicture picture = id3.PictureList[0]; if (picture.PictureType != PictureType.CoverFront) { foreach (var apic in id3.PictureList) { if (apic.PictureType == PictureType.CoverFront) { picture = apic; break; } } } CreatePictureOnUIThread(track, picture); } trackList.Add(track); double percent = i * 100.0 / totalFiles; if (percent - PercentComplete >= 0.9 || (i % 100) == 0) { UpdateProgress(percent); } } if (!_cancelScanning) { UpdateProgress(100); } } finally { EndRecursiveScanning(totalFiles, trackList); } }
private static void CreatePictureOnUIThread(Track track, IAttachedPicture picture) { if (track == null) throw new ArgumentNullException("track"); if (picture == null) throw new ArgumentNullException("picture"); if (!Application.Current.Dispatcher.CheckAccess()) { Application.Current.Dispatcher.Invoke(new Action<Track, IAttachedPicture>(CreatePictureOnUIThread), track, picture); return; } track.Picture = new Picture(picture); }