如果您使用MediaElement,请确保不会遇到以下问题:
http://msdn.microsoft.com/en-us/library/cc626563(v=vs.95).aspx
ArgumentNullException - mediaStreamSource为空。
调用此方法后,MediaElement.Source返回null。如果调用此方法并设置了MediaElement.Source,则最后的操作将获胜。
如果在UI树中移除了具有打开的MediaStreamSource的MediaElement,则可能会忽略对SetSource的后续调用。为确保featureSetSource调用有效,请在从UI树中分离MediaElement之前将Source属性设置为null。
自然而然地,人们会期望,如果他们只使用SetSource(somestream)来释放资源,则使用SetSource(null)来释放资源。没有,他们认为“更好”,您必须使用Source = null而不是SetSource(null)来释放资源,并且SetSource(null)会引发ArgumentNullException。
这就是我所说的设计错误(违反了“最少预期”行为规则,并导致仅在运行时咬你的错误[除非有人制定了静态分析规则来捕获这种事情 - 当然需要元数据,表明某些参数不能为空,例如在代码合同中])
我昨天在重构
ClipFlair Studio的AudioRecorder控件中引入了此错误:-(
请注意,您无法在MediaElement中使用类似
Source= stream的东西来打开Stream,因为那是一个Uri属性(不是Object属性,也接受Stream),您必须使用
SetSource(stream),所以您也希望能够使用SetSource(null)来释放资源。
更新:在AudioRecorderControl的AudioRecorderView类(使用MVVM模式)中
修复了此问题,在Audio属性的“set”访问器中需要以下空值保护模式。
if (mediaStreamSource != null)
player.SetSource(mediaStreamSource);
//must set the source once, not every time we play the same audio,
//else with Mp3MediaSource it will throw DRM error
else
player.Source = null;