private MusicLibrary()
        {
            ArtistGroupDictionary = CreateObservableGroupDictionary <Artist>();
            ArtistsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = ArtistGroupDictionary
            };

            AlbumGroupDictionary = CreateObservableGroupDictionary <Album>();
            AlbumsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = AlbumGroupDictionary
            };

            SongGroupDictionary = CreateObservableGroupDictionary <Song>();
            SongsCollection     = new CollectionViewSource()
            {
                IsSourceGrouped = true, Source = SongGroupDictionary
            };

            _cache = new MusicLibraryCache();
        }
        public Task LoadCache(CoreDispatcher dispatcher, StorageFile cacheFile = null)
        {
            if (Interlocked.CompareExchange(ref _hasLoadedCache, 1, 0) == 1)
            {
                return(null);
            }

            return(Task.Run(new Action(() =>
            {
                try
                {
                    _cache = AsyncInline.Run(new Func <Task <MusicLibraryCache> >(() => MusicLibraryCache.Deserialize(cacheFile)));
                    var c = dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low,
                                                () =>
                    {
                        foreach (Artist artist in _cache.Artists.Values)
                        {
                            AddItemToGroup(ArtistGroupDictionary, artist, a => a.ArtistName[0]);
                        }
                        foreach (List <Album> albums in _cache.Albums.Values)
                        {
                            foreach (Album album in albums)
                            {
                                AddItemToGroup(AlbumGroupDictionary, album, a => a.AlbumName[0]);
                            }
                        }
                        foreach (List <Song> songs in _cache.Songs.Values)
                        {
                            foreach (Song song in songs)
                            {
                                AddItemToGroup(SongGroupDictionary, song, a => song.SongTitle[0]);
                            }
                        }
                    });
                }
                catch { }
            })));
        }