Пример #1
0
        public Task <IEnumerable <SynoTrack> > GetTracksForAlbumAsync(SynoItem album)
        {
            var tcs = new TaskCompletionSource <IEnumerable <SynoTrack> >(album);

            string urlBase = string.Format("http://{0}:{1}", this.Host, this.Port);
            // var url = urlBase + "/webman/modules/AudioStation/webUI/audio_browse.cgi";
            var url = urlBase + this.versionDependentResourcesProvider.GetAudioSearchWebserviceRelativePath(this.DsmVersion);

            HttpWebRequest request = BuildRequest(url);

            int    limit      = 100;
            string postString = string.Format(@"action=browse&target={0}&server=musiclib_music_aa&category=&keyword=&start=0&sort=title&dir=ASC&limit={1}", HttpUtility.UrlEncode(album.ItemID), limit);


            byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(postString);

            var requestStreamAr = request.BeginGetRequestStream(ar =>
            {
                // Just make sure we retrieve the right web request : no access to modified closure.
                HttpWebRequest webRequest = (HttpWebRequest)ar.AsyncState;

                var requestStream = webRequest.EndGetRequestStream(ar);
                requestStream.Write(postBytes, 0, postBytes.Length);
                requestStream.Close();

                var getResponseAr = webRequest.BeginGetResponse(
                    responseAr =>
                {
                    // Just make sure we retrieve the right web request : no access to modified closure.
                    var httpWebRequest = responseAr.AsyncState;

                    var webResponse    = webRequest.EndGetResponse(responseAr);
                    var responseStream = webResponse.GetResponseStream();
                    var reader         = new StreamReader(responseStream);
                    var content        = reader.ReadToEnd();

                    long count;
                    IEnumerable <SynoTrack> tracks;
                    SynologyJsonDeserializationHelper.ParseSynologyTracks(content, out tracks, out count, urlBase);

                    tracks = tracks.OrderBy(o => o.Track);

                    var isOnUiThread = Deployment.Current.Dispatcher.CheckAccess();
                    if (isOnUiThread)
                    {
                        if (count > limit)
                        {
                            // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit));
                        }

                        tcs.SetResult(tracks);

                        // callback(tracks);
                    }
                    else
                    {
                        Deployment.Current.Dispatcher.BeginInvoke(
                            () =>
                        {
                            if (count > limit)
                            {
                                // MessageBox.Show(string.Format("number of available artists ({0}) exceeds supported limit ({1})", count, limit));
                            }
                            tcs.SetResult(tracks);
                        });
                    }
                },
                    webRequest);
            }, request);



            //var getRequestStreamTask = Task.Factory.FromAsync(
            //    requestStreamAr,
            //    ar =>
            //        ,
            //    TaskCreationOptions.None,
            //    TaskScheduler.FromCurrentSynchronizationContext());

            return(tcs.Task);
        }