如何在c#winform应用程序中释放对象?

时间:2012-10-15 06:57:24

标签: c# winforms object memory-management

  

可能重复:
  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

但是我仍然想要克服这件事bcoz我没有从那里得到帮助

3 个答案:

答案 0 :(得分:2)

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

您可以使用dispose代替强制垃圾回收。

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

并使用带有using语句的类实例。 Here是如何使用IDisposable模式的好答案。

答案 1 :(得分:0)

您需要释放资源

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

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

答案 2 :(得分:0)

您可以使用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...