2017-07-14 29 views
0

現在、ピアノアプリを作成して時間を過ごしています。各キーは、クリックすると起動するコマンドを持つ単純なボタンで表されます。これはViewModelには、この方法を実行につながる:C#WPF Windows Media Playerを呼び出す

private void PlaySound(object parameter) 
    { 
     var mediaPlayer = new MediaPlayer(); 
     mediaPlayer.Open(new System.Uri(@SoundBar.GetSoundPathByIdent(int.Parse(parameter.ToString())))); 
     mediaPlayer.Play(); 
    { 

私は問題がMediaPlayerのがそれを集めるからGarbageCollectorを防ぐ弱い参照を残していることだと思います。しばらく再生した後にRAMのオーバーロードにつながります。

私が見つけた解決策は、mediaPlayer.Close();を呼び出すことでした。 しかし、これはサウンドの再生が終了した後でなければなりません。さもなければ、それはカットされます。

再生されたサウンドの再生が終了したかどうかを確認する方法はありますか?

私はすでに研究とテストをしばらく費やしていましたが、実際の解決策は思いつきませんでした。

+1

['WeakReference'](https://msdn.microsoft.com/en-us/library/system.weakreference(v = vs.110).aspx)**ではガベージコレクタが収集できない**参照。それが「WeakReference」の全ポイントです。 –

答えて

1

PositionNaturalDurationプロパティは、あなたがにいるストリームに

(すなわち。Position/NaturalDurationはあなた割合として再生位置を表し、0.0〜1.0の値を示します)しかし、あなたがしたいことがあり場所についての詳細を与えますメディアを再生するための「オーケストレーター」を構築します。同時にすべてのサウンドを再生したくないと仮定すると、オーケストレーターはメディアプレーヤーの寿命を管理し、再生中の場所を特定する責任があります。

アプリケーションでは、起動時にオーケストレーターの1つのインスタンスを作成できます。オーケストレーターは、和音を演奏する必要があるときに再利用できるメディアプレーヤーのプールを作成して管理することができます。次に、あなたのピアノのアプリケーションは、同時に特定の数のコードをサポートし、どのメディアプレーヤーがフリーで、どれが "忙しい"オーディオを再生しているかを決定する単一のポーラーを持つことができます。

+0

私の場合、キーボードの特定のキーにボタンを繋いでいるので、ピアノは同時に押された音を再生できるはずです – Pulle

+0

もちろん、同時に複数の音を鳴らしますが、何回ですか?私のポイントは、妥当な数(例えば10、または16)を決めてからオーケストレーターが、音が出てきたときや限界に達したときに再生するために使用できるmediaPlayerオブジェクトのプールを維持することに責任があるということでしたあなたはそれを処理する方法を決めることができます(おそらく無視する)。オーケストレーターは、どのメディアプレーヤーが「無料」であり、2つのコレクションを持っているかによって「ビジー」であるかを知るでしょう –

関連する問題