0

無限のオーディオ ストリームを再生するアプリを作成しています。現在再生中のトラックのタイトルとアーティストを取得するために照会できる別の Web サービスがあります。私がやりたいことは、そのサービスを 20 秒ごとにクエリし、それに応じてトラックのタイトル/アーティストを設定することです。現在、アプリケーションの外でストリームを再生できるように、バックグラウンド AudioPlayerAgent を使用しています。これが私がこれまでに持っているコードです:

public AudioPlayer()
    {
        if (!_classInitialized)
        {
            _classInitialized = true;
            // Subscribe to the managed exception handler
            Deployment.Current.Dispatcher.BeginInvoke(delegate
            {
                Application.Current.UnhandledException += AudioPlayer_UnhandledException;

            });
            trackTimer = new Timer(TrackTimerTick, null, 1000, 5000);
        }
    }

    public void TrackTimerTick(object state) {             
            // Create a HttpWebrequest object to the desired URL.
            HttpWebRequest trackRequest = (HttpWebRequest)HttpWebRequest.Create("<stream url>");
            // Start the asynchronous request.
            IAsyncResult result = (IAsyncResult)trackRequest.BeginGetResponse(new AsyncCallback(TrackCallback), trackRequest);
    }

    public void TrackCallback(IAsyncResult result) {
        if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing && result != null) {
            try {
                // State of request is asynchronous.
                HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState;
                HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result);
                using (StreamReader httpwebStreamReader = new StreamReader(trackResponse.GetResponseStream())) {
                    string results = httpwebStreamReader.ReadToEnd();
                    StringReader str = new StringReader(results);
                    XDocument trackXml = XDocument.Load(str);

                    string title = (from t in trackXml.Descendants("channel") select t.Element("title").Value).First<string>();
                    string artist = (from t in trackXml.Descendants("channel") select t.Element("artist").Value).First<string>();
                    if (BackgroundAudioPlayer.Instance.Track != null) {
                        AudioTrack track = BackgroundAudioPlayer.Instance.Track;
                        track.BeginEdit();
                        track.Title = title;
                        track.Artist = artist;
                        track.EndEdit();
                    }

                }
                trackResponse.Close();
                NotifyComplete();
            } catch (WebException e) {
                Debug.WriteLine(e);
                Debug.WriteLine(e.Response);
            } catch (Exception e) {
                Debug.WriteLine(e);
            }
        }  
    }

HttpWebRequest からの応答を読み取ろうとすると、常に Web 例外がスローされます。これはこれを行う正しい方法ですか?これを修正する方法について誰か提案がありますか?

4

2 に答える 2

0

を閉じているわけではありませんHttpWebResponse。これは必需品です。また、その過負荷がXDocument.Load()かかるStreamので、を使用する必要はまったくありませんStreamReader

編集:申し訳ありませんが、私Close()は最後に呼び出しを見落としました。しかし、他のコメントはまだ当てはまります。

それでも問題が解決しない場合は、少なくともコードがきれいに見えるようになります。

public void TrackCallback(IAsyncResult result) {
    if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing && result != null) {
        try {
            // State of request is asynchronous.
            HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState;
            using (HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result)){
                XDocument trackXml = XDocument.Load(trackResponse.GetResponseStream());

                string title = (from t in trackXml.Descendants("channel") select t.Element("title").Value).First<string>();
                string artist = (from t in trackXml.Descendants("channel") select t.Element("artist").Value).First<string>();
                if (BackgroundAudioPlayer.Instance.Track != null) {
                    AudioTrack track = BackgroundAudioPlayer.Instance.Track;
                    track.BeginEdit();
                    track.Title = title;
                    track.Artist = artist;
                    track.EndEdit();
                }
            }
            }
            NotifyComplete();
        } catch (WebException e) {
            Debug.WriteLine(e);
            Debug.WriteLine(e.Response);
        } catch (Exception e) {
            Debug.WriteLine(e);
        }
    }  
}
于 2012-05-06T22:12:56.020 に答える
0

これは、AudioPlayer が音楽の再生を開始した後に範囲外になることに関係しています。AudioPlayer はごくわずかな時間しか存続せず、への呼び出し後に終了しました。NotifyComplete

この投稿に対する私の返信を見てください: AudioPlayerAgent, timer and webservice

詳細: バックグラウンド オーディオ スレッドは、NotifyCompleteが呼び出された後に「一時停止」します。戻る方法は、ユーザーが再生を変更したとき (OnUserAction)、または曲が終了したとき (OnPlayStateChanged) です。引き続きプレイする場合は、OnPlayStateChanged メソッド内で新しい情報を取得してください。

于 2012-05-15T23:21:15.797 に答える