MediaElement 可能会在新媒体加载时发生内存泄漏?

MediaElement possible memory leak on new media load?

我正在用 C# 为媒体播放器开发 WPF 应用程序,我正在使用 mediaElement 控件来托管媒体。

因为我希望用户能够在播放器中加载视频和图像,所以我在 mediaOpened 事件,每次加载新媒体时检查它是否具有时间跨度(因此播放器将其视为 video)或 图片

为了检查这个 if/else 语句是否有效,我在每种情况下都放置了一个消息框来给我反馈,播放器确实正确识别了媒体类型。

到目前为止一切顺利。

我加载了一个视频,一切都按预期进行,我收到消息框说 "video!"。

但是当我加载第二个视频时,消息框出现了两次。

当我再加载一个视频时,消息框出现了 3 次!

更奇怪的是,如果我接下来加载图片,消息框会出现 4 次,而不是像这样的一系列消息框,

"video!""video!""video!""picture!",我得到

"picture!""picture!""picture!""picture!"。

播放器似乎将媒体(或 mediaOpened 事件)存储在某种列表中,每次我加载一个新媒体时,它都会检查该列表中的所有媒体并给我一条消息一。 (我还没有写任何代码来支持播放列表功能,所以我不知道这些媒体可以存储在哪里...)

我试过在用户按下加载新媒体按钮时将 mediaElement 的源声明为 null,以确保在加载新媒体之前 mediaElement 源是干净的,但它没有任何效果。

这听起来像是内存泄漏吗? 我是否错过了一个特定的卸载事件,我应该调用媒体更改? 谢谢!

事实证明,在大多数关于如何开发媒体播放器的在线示例中,

每个人都建议在点击播放器中的加载按钮后使用下一行:

mediaElement.MediaOpened += new RoutedEventHandler(mediaElement_MediaOpened);

但似乎没有人知道加载新媒体时需要卸载这些媒体,这可以通过在我们设置媒体元素的新源之前放置完全相反的位置来实现,所以它会是例如,按此顺序:

mediaElement.MediaOpened -= new RoutedEventHandler(mediaElement_MediaOpened);

mediaElement.Source = 新 Uri(dlg.FileName);

mediaElement.MediaOpened += new RoutedEventHandler(mediaElement_MediaOpened);

希望这对那里的人有所帮助!