2017-07-14 138 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对象池,它可以用来在它们出现时播放声音,并且当达到极限时你可以决定如何处理(可能忽略)。管弦乐队会知道哪些媒体播放器是“免费”的,哪些媒体播放器是哈瓦两个系列的“忙碌” –