2012-03-10 4 views
1

私は、オンラインストリームから音楽を再生するバックグラウンドオーディオエージェントを作成しています。また、トラック名とアーティストの更新を定期的に確認しています。私は名前とアーティストを取得するためにHttpWebRequestオブジェクトを使用しようとしていますが、HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result);と呼び出すたびに以下のエラーがスローされます。その中にさらにHttpWebRequestがnullを返すResponseStatusCode

ResponseStatusCode = 'trackRequest.ResponseStatusCode' threw an exception of type 'System.NullReferenceException'

と:trackRequestオブジェクトにさらに掘り

at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
at AudioPlaybackAgent.AudioPlayer.TrackCallback(IAsyncResult result) 
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2) 
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ThreadPool.WorkItem.doWork(Object o) 
at System.Threading.Timer.ring() 

が、私はこれを見つける:

A first chance exception of type 'System.Net.WebException' occurred in System.Windows.dll

WebExceptionのスタックトレースは以下のとおりです。私はこれを見つける:

at System.Net.HttpWebRequest.get_ResponseStatusCode() 
at AudioPlaybackAgent.AudioPlayer.TrackCallback(IAsyncResult result) 
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2) 
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ThreadPool.WorkItem.doWork(Object o) 
at System.Threading.Timer.ring() 

ここに私が使用しているコードがあります。 TrackTimerTick関数は、Timerによって20秒ごとに呼び出されます。

public static void TrackTimerTick(object state) { 
     try { 
      if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing) { 
       // Create a HttpWebrequest object to the desired URL. 
       HttpWebRequest trackRequest = (HttpWebRequest)HttpWebRequest.Create("<track/artist url"); 
       // Start the asynchronous request. 
       IAsyncResult result = (IAsyncResult)trackRequest.BeginGetResponse(new AsyncCallback(TrackCallback), trackRequest); 
      } 
     } catch (WebException e) { 
      Debug.WriteLine(e.Message); 
     } catch (Exception e) { 
      Debug.WriteLine(e.Message); 
     } 
    } 


    public static void TrackCallback(IAsyncResult result) { 
     // State of request is asynchronous. 
     HttpWebRequest trackRequest = (HttpWebRequest)result.AsyncState; 
     HttpWebResponse trackResponse = (HttpWebResponse)trackRequest.EndGetResponse(result); // WebException thrown here 

     using (StreamReader httpwebStreamReader = new StreamReader(trackResponse.GetResponseStream())) { 
      string results = httpwebStreamReader.ReadToEnd(); 
      XDocument trackXml = XDocument.Load(results); 

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


    } 

誰でもこの問題を解決できますか?前もって感謝します。

+0

2つのスレッドから応答ステータスにアクセスすることはありませんか? – Cameron

+0

TrackCallbackは私がレスポンスを参照する唯一の場所なので、私はそう信じません。 – bfink

答えて

0

問題は、応答が到着する前にNotifyComplete()を呼び出すことです。何が起こったのか分かりませんが、リクエストを開始してNotifyCompleteを呼び出し、OSがエージェントのプロセスを停止させた後、次回エージェントがWebClientを起動するとすぐに例外がスローされます。

解決策は、応答を受け取るまでNotifyCompleteを呼び出さないことです。

+0

これ以上説明できますか? NotifyComplete()を動かしてトラックのテキストを取得することを試みましたが、アプリ内ポーズボタンをクリックしても音楽は一時停止しませんでした。もう少し提案していただけますか? – bfink

+0

私はオーディオ・バックグラウンド・エージェントを書いたことがありませんでした。私は、あなたがまだ適切な時間にNotifyCompleteを呼び出さないことをお勧めします。最初に問題になるのは、タイマーを使用していることです。プロセスが制御コマンドの間でフリーズしているので、タイマのティックイベントはコマンド間で起動しません。あなたが本当にあなたのオーディオエージェントでWebリクエストをしたいのであれば(それは良いアイデアではありませんし、本当に必要です)、PlayStateChangedでリクエストを開始し、レスポンスコールバックでNotifyCompleteを呼び出してみてください。これ以上の情報がなければ、これは私の最高のアイデアです。 –

+0

ありがとうございます。私がしたいのは、オーディオエージェントを起動したメインアプリケーションが無効になっていても、新しいバックグラウンドデータを取得するために、オーディオバックグラウンドエージェントに20〜30秒ごとにサーバーに問い合わせさせることです。これは可能でしょうか? – bfink