【问题标题】:how to free object in c# winform application? [duplicate]如何在 c# winform 应用程序中释放对象? [复制]
【发布时间】:2012-10-15 06:57:24
【问题描述】:

可能重复:
How do i free objects in C#

我的问题是我正在使用..

 video = new Video(vpath[a]);
 video1 = new Video(vpath[a + 1]);
 video2 = new Video(vpath[a - 1]);

在 winform 上同时显示 3 个视频.. 这在一个由按钮事件调用的函数中......但它消耗大量内存......

我这样做了

 video = null;
 video1 = null;
 video2 = null;

但它仍然没有帮助我......我如何减少这 3 个对象的内存消耗?

我的问题将被标记为可能与

重复
https://stackoverflow.com/questions/2406794/how-do-i-free-objects-in-c-sharp

但我仍然想克服这件事,因为我没有得到帮助

【问题讨论】:

  • 好吧,另一个线程确实解释了它。在您不再需要的任何对象上调用 Dispose()。
  • 它释放非托管资源.. 会有帮助吗??
  • 是什么让您认为将变量设置为 null 没有帮助?您是否出现内存不足错误或处理的工作集正在增加?
  • 在播放视频时或全部停止后是否会消耗更多内存?
  • @CodeIgnoto 在视频加载到应用程序时消耗内存

标签: c# winforms object memory-management


【解决方案1】:

将对象设置为 null 并不意味着在垃圾回收发生之前它不会留在内存中。您可以显式调用垃圾回收 (GC.Collect()),但除非您别无选择,否则这是不可取的。

您可以使用dispose 而不是强制垃圾回收。

class Video : IDisposable
{
    public void Dispose()
    {
        //Close managed resources and etc. 
    }
}

并使用带有using 语句的类实例。 Here 很好地回答了如何使用 IDisposable 模式。

【讨论】:

  • 我不想使用GC.Collect() 任何其他选项?
  • 在考虑使用GC.Collect() 之前,请阅读blogs.msdn.com/b/ricom/archive/2004/11/29/271829.aspx。我只会使用它,我真的很确定我想做什么并且没有其他方法。
  • @Ekk 你完全正确。我刚刚列出了一种可能的方式。
  • 好的,我不能打电话给video.Dispose() 这会有帮助吗?
  • @Drone 在离开using 块后自动调用Dispose。当然你可以手动调用它来避免using语句。
【解决方案2】:

你需要释放资源

   using (Video video = new Video(vpath[a]))
   {
    .....
   }

最后,您可以使用 SetProcessWorkingSetSize 来修剪它使用的内存,请参阅此处的答案:webbrowser control with memory increasing problem

【讨论】:

  • 好吧,似乎通过使用 video1.Dispose() 和 video2.Dispose() 我可以释放它的资源,但我不能在视频对象 bcoz 上使用 Dispose() 只使用这个对象播放视频,所以现在内存消耗要少得多
【解决方案3】:

您可以改用 WMP 来显示您的视频,这样 WMP 会礼貌地处理您的视频流,而不是一次将其全部加载到内存中。

How to: Embed Windows Media Player on a Form

然后您只需使用:

var video1 = new Uri("c:\\somefolder\\myVideo1.avi");
axWindowsMediaPlayer1.URL = video1.AbsoluteUri;

var video2 = new Uri("c:\\somefolder\\myVideo2.avi");
axWindowsMediaPlayer2.URL = video2.AbsoluteUri;

// and so on...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多