2017-07-14 203 views
0

我正在通過創建一個鋼琴應用程序來傳遞我的時間。每個鍵都由一個簡單的按鈕和一個點擊時觸發的命令代表。這導致視圖模型執行這個方法: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從收集它的WeakReference的。玩一段時間後導致RAM超載。

我找到的解決方案是調用:mediaPlayer.Close(); 但是,這應該只發生在聲音播放結束後,否則會被切斷。

有沒有辦法檢查播放的聲音是否已完成播放?

我已經花了一些時間做研究和測試,但我無法想出一個工作解決方案。

+1

['WeakReference'](https://msdn.microsoft.com/en-us/library/system.weakreference(v = vs.110).aspx)does not不**防止垃圾收集器收集參考資料。這是'WeakReference'的全部要點。 –

回答

1

PositionNaturalDuration性能給你你在哪裏流中(即Position/NaturalDuration爲您提供了0.0和1.0之間的值,表示爲百分比的播放位置)

但你可能想細節爲您的媒體播放構建「協調器」。假設您不想同時播放所有聲音,協調員可以負責管理媒體播放器的使用期限,並確定播放的位置。

在您的應用程序中,您可以在啓動時創建一個單一的協調器實例。管絃樂隊可以創建和管理媒體播放器,當需要發揮和絃時可以重複使用。然後,您的鋼琴應用程序可以同時支持一定數量的和絃,並擁有一個輪詢器,可以確定哪些媒體播放器是免費的,哪些是忙音頻播放。

+0

在我的情況下,鋼琴應該能夠同時播放按下的聲音,因爲我將按鈕綁定到鍵盤上的某些按鍵 – Pulle

+0

當然,同時播放多個聲音,但有多少個?我的意思是,你可以決定一個合理的數字(比如說10或者16),然後管絃樂員將負責維護一個mediaPlayer對象池,它可以用來在它們出現時播放聲音,並且當達到極限時你可以決定如何處理(可能忽略)。管絃樂隊會知道哪些媒體播放器是「免費」的,哪些媒體播放器是哈瓦兩個系列的「忙碌」 –