私は無限のオーディオストリームを再生するアプリケーションを作成しています。現在再生中のトラックのタイトルとアーティストを取得するためにクエリできる別のWebサービスがあります。私がしたいことは、20秒ごとにそのサービスを照会し、それに応じてトラックタイトル/アーティストを設定することです。現在、私は背景がAudioPlayerAgentを使用しているので、ストリームは自分のアプリケーションの外で再生できます。AudioPlayerAgentのHttpWebRequest
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のからの応答を読み取ろうというスローされます。ここに私はこれまで持っているコードです。これはこれを行う正しい方法ですか?私はこれをどのように修正することができるかに関して誰かが提案をしていますか?
例外をキャッチしないでください。 http://stackoverflow.com/questions/1742940/why-not-catch-general-exceptions http://msdn.microsoft.com/en-us/library/ms182137%28v=vs.100%29.aspx –
何も修正されません。 – bfink
@Sedgwickzのコメントが部分的に修正されているようですが、トラックデータを正しく取得できます。しかし、一度私はNotifyComplete()を呼び出すと、タイマーはもはや目立たない - これを修正する方法のヒント? – bfink