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);
        }