2016-08-05 3 views
0

アクセス:私は、サーバー上の音楽プレーヤーを制御するためにWebApiApplicationを使用.NETのWebアピInvalidOperationExceptionがグローバルオブジェクト私が何をしようとしている

を(民主的な音楽プレーヤーの一種としてそれを想像:私のハウスメイトと私すべてスマートフォン経由でアクセスでき、同じ方法で制御できます)。

ウェブ呼び出しはこのように作られています:

http://localhost:64199/api/Music?category=Ambient&action=play

または

http://localhost:64199/api/Music?category=Ambient&action=next

私のコントローラは次のようになります。

public class MusicController : ApiController 
{ 

    const string MUSICPATH = @"...\Songs"; 

    public HttpResponseMessage Get(string category, string action, string song = "", bool shuffle = false) 
    { 

     // DirMusicPlayer.Category = category; 
     DirMediaPlayer dmp = DirMediaPlayer.getInstance(category); 

     System.Diagnostics.Debug.WriteLine("Thread-ID (Ctrl): " + Thread.CurrentThread.ManagedThreadId); 

     switch (action) 
     { 
      case "play": 
       if (song.Equals("")) 
       { 
        dmp.PlayAll(); 
       } 
       else 
       { 
        dmp.PlaySong(song); 
       } 
       break; 
      case "stop": 

       dmp.Stop(); 
       break; 
      case "next": 
       dmp.PlayNext(); 
       break; 
      case "prev": 
       dmp.PlayPrevious(); 
       break; 
      case "shuffle": 
       dmp.Shuffle = shuffle; 
       break; 
      default: 
       break; 
     } 


     return Request.CreateResponse(HttpStatusCode.OK, "Playing"); 
    } 

} 

プレイヤーは、特殊なシステムです。 Windows.Media.MediaP層として実装され、シングルトンとして実装されています。最初にGlobal.asaxでインスタンス化され、ランダムな曲から始まります。

後で(Web呼び出しを使用して)アクセスしようとするたびに、プレーヤが実行中のスレッドにアクセスできないため、アプリケーションがInvalidOperationExceptionでクラッシュします。

私はスレッドで何が起こるか考え出した:

  1. スレッドID(APPSTART):1 // Global.asaxのスレッド
  2. スレッドID(MediaPlayerの):1つの
  3. スレッド-ID(MusicController):スレッドプールから7は//コントローラインスタンス
  4. スレッドID(MediaPlayerの):7つの//クラッシュ、MediaPlayerのインスタンスがスレッドに属しているため、1

あなたが見てきたように、私は問題が何であるかを知っていますが、私が.NETを使い慣れていないので、解決方法はわかりません。私はプレーヤーをコントロールし、それらのApiControllersによって呼び出されるグローバルなユニークなコントローラのようなものが必要です。

私はこの質問が以前に尋ねられていないことを願っています。私はそれを調べようとしましたが、何を検索するのか正確には分かりませんでした。 MediaPlayerのはDispatcherObjectから継承し、それは述べている

+0

私はこれまでどおり動作するとは思わない。 WepAPIは要求/応答システムです。それは、曲を演奏するのに十分な長さの接続を開いたままにするつもりはありません。あなたはWebAPIを使ってあなたのアプリにその曲を読み込んでそれを再生しますが、あなたはWebAPIからそれを再生しません。 –

+0

私はWebApiが新しい呼び出しを待つことができるように、Web呼び出し後に特定の曲を再生するように頼まれていない別のアプリ(Windows Media Playerなど)が必要になりますか?ありがとう、スティーブン! – 19CMB94

答えて

0

ディスパッチャが作成されたスレッドだけが直接DispatcherObjectにアクセスできます。 DispatcherObjectが作成されたスレッド以外のスレッドからDispatcherObjectにアクセスするには、DispatcherObjectが関連付けられているDispatcherでInvokeまたはBeginInvokeを呼び出します。

今、私はこれをテストするために使用可能なセットアップを持っていないと私はMediaPlayerのクラスは、Webアプリケーションで使用するために設計されていたとは思わないが、あなたはこれを試みる場合があります:それを

dmp.Dispatcher.Invoke(() => dmp.PlayNext();); 

正しいスレッドでPlayNextメソッドを呼び出します。それが成功しない場合、私はそれがうまくいかないと受け入れる必要があるのではないかと心配しています。

+0

ありがとうrene、今何かが起こる(私は正確に知っていない、何が、それはクラッシュしない)。ディスパッチャを詳しく見ていきます – 19CMB94

関連する問題