C# 如何释放MediaElement使用的内存

C# 如何释放MediaElement使用的内存,c#,wpf,mediaelement,C#,Wpf,Mediaelement,我使用MediaElement在很长一段时间内循环显示视频剪辑。一段时间后(Win 7/4 GB RAM为数小时),程序崩溃,但“内存不足”类型除外。我监控了在使用Process Explorer系统内部构件时使用的内存,并使用System.Diagnostics.Process方法记录了它。这两种方式都显示使用的内存逐渐增加 代码如下: XAML: 我还测试了MediaElement对象在几个剪辑后动态创建、销毁(以及所有取消订阅事件等)并再次创建的情况。记忆又被消耗得越来越多了 如有任何建议

我使用MediaElement在很长一段时间内循环显示视频剪辑。一段时间后(Win 7/4 GB RAM为数小时),程序崩溃,但“内存不足”类型除外。我监控了在使用Process Explorer系统内部构件时使用的内存,并使用System.Diagnostics.Process方法记录了它。这两种方式都显示使用的内存逐渐增加

代码如下:

XAML:

我还测试了MediaElement对象在几个剪辑后动态创建、销毁(以及所有取消订阅事件等)并再次创建的情况。记忆又被消耗得越来越多了


如有任何建议,将不胜感激

我的建议是:

private void VideoControl_MediaEnded(object sender, RoutedEventArgs e)
{
    // choose the next media file 
    ...
    //make the following explicitly
    MediaPlayer.Stop();      
    MediaPlayer.Source = null;

    model.OnPropertyChanged("MySource");

    MediaPlayer.Play();
}

我的建议如下:

private void VideoControl_MediaEnded(object sender, RoutedEventArgs e)
{
    // choose the next media file 
    ...
    //make the following explicitly
    MediaPlayer.Stop();      
    MediaPlayer.Source = null;

    model.OnPropertyChanged("MySource");

    MediaPlayer.Play();
}

尝试在XAML中指定MediaElement
UnloadingBehavior=“Close”
属性

根据MSDN
MediaState::Close
指示

释放所有媒体资源(包括视频内存)


尝试在XAML中指定MediaElement
UnloadingBehavior=“Close”
属性

根据MSDN
MediaState::Close
指示

释放所有媒体资源(包括视频内存)


你是如何“摧毁”你的MediaElement的?这是一个UI元素,WPF在GC'ing UI元素方面做得很糟糕。是否在播放结束时尝试使Source=null?您确实应该尝试一下。下面是我如何“销毁”MediaElement obejct(以编程方式创建,而不是以XAML创建):MediaPlayer.Stop();MediaPlayer.MediaEnded-=MediaPlayer\u MediaEnded;MediaPlayer.MediaOpen-=MediaPlayer\u MediaOpen;MediaPlayer.Close();GridTest.Children.Remove(MediaPlayer);MediaPlayer=null;GC.Collect();如果使用绑定源属性创建,也在Close()之前:BindingOperations.ClearBinding(MediaPlayer、MediaElement.SourceProperty);你是如何“摧毁”你的MediaElement的?这是一个UI元素,WPF在GC'ing UI元素方面做得很糟糕。是否在播放结束时尝试使Source=null?您确实应该尝试一下。下面是我如何“销毁”MediaElement obejct(以编程方式创建,而不是以XAML创建):MediaPlayer.Stop();MediaPlayer.MediaEnded-=MediaPlayer\u MediaEnded;MediaPlayer.MediaOpen-=MediaPlayer\u MediaOpen;MediaPlayer.Close();GridTest.Children.Remove(MediaPlayer);MediaPlayer=null;GC.Collect();如果使用绑定源属性创建,也在Close()之前:BindingOperations.ClearBinding(MediaPlayer、MediaElement.SourceProperty);也尝试了MediaPlayer.Stop();MediaPlayer.Source=null;MediaPlayer.Close();然后在VideoControl_MediaEnded()中重新分配了Source,但没有任何效果。@MDimitrov-Hmmm,您也可以尝试将null分配给整个MediaPlayer对象,然后重新实例化它。我也曾三次这样做,在上面的一篇评论中写到了我是如何“销毁”的这个object@MDimitrov您是否尝试过使用JetBrains提供的DotMemory等工具来分析内存流量?我觉得你的案例并不像我第一眼看到的那么简单。我使用了VMMap-Sysinternals,它在我“销毁”MediaElement对象后没有显示释放的内存。再次创建后,内存使用继续增长,例如,私有字节,但我将深入研究,也将尝试DotMemory。也尝试了MediaPlayer.Stop();MediaPlayer.Source=null;MediaPlayer.Close();然后在VideoControl_MediaEnded()中重新分配了Source,但没有任何效果。@MDimitrov-Hmmm,您也可以尝试将null分配给整个MediaPlayer对象,然后重新实例化它。我也曾三次这样做,在上面的一篇评论中写到了我是如何“销毁”的这个object@MDimitrov您是否尝试过使用JetBrains提供的DotMemory等工具来分析内存流量?我觉得你的案例并不像我第一眼看到的那么简单。我使用了VMMap-Sysinternals,它在我“销毁”MediaElement对象后没有显示释放的内存。再次创建后,内存使用继续增长,例如私有字节,但我将深入研究,也将尝试DotMemory。谢谢,我将在下一个案例中测试它。这个问题是通过使用通用Windows视频驱动器解决的谢谢,我将在下一个案例中测试它。这个问题是通过使用通用的Windows视频驱动程序解决的
private void VideoControl_MediaEnded(object sender, RoutedEventArgs e)
{
    // choose the next media file 
    ...
    //make the following explicitly
    MediaPlayer.Stop();      
    MediaPlayer.Source = null;

    model.OnPropertyChanged("MySource");

    MediaPlayer.Play();
}