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