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

如何在c#winform应用程序中释放对象?,c#,winforms,object,memory-management,C#,Winforms,Object,Memory Management,可能重复: 我的问题是我正在使用 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个对象的内存消耗 我的问题

可能重复:

我的问题是我正在使用

 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

但我仍然想克服这一点,因为我没有从中得到帮助,将对象设置为null并不意味着它在垃圾收集发生之前不会留在内存中。您可以显式调用垃圾收集(
GC.Collect()
),但除非您没有其他选择,否则这是不可取的

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

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

并将类的实例与
一起使用
语句。这是如何使用IDisposable模式的好答案。

您需要释放资源

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

最后,您可以使用SetProcessWorkingSetSize来调整它使用的内存,请参见此处的答案:

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

然后您只需使用:

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...

嗯,另一条线索解释得很清楚。对不再需要的任何对象调用Dispose()。释放其非托管资源。。这会有帮助吗?是什么让您认为将变量设置为null没有帮助?您是否内存不足错误或处理的工作集正在增加?在播放视频时还是在所有视频都停止后消耗更多内存?@codeignot当视频加载到应用程序时消耗内存我不想使用
GC.Collect()< /代码>其他选项吗?请在考虑使用<代码> GC .CuCub()/<代码>之前阅读。我只会使用它,我真的很确定我想做什么,没有其他办法。@Ekk你完全正确。我刚刚列出了一种可能的方法。好的,我不能调用
video.Dispose()
这会有帮助吗?@Drone在离开
使用
后会自动调用block
Dispose
。当然,您可以手动调用它,以避免使用
语句
。好吧,使用video1.Dispose()和video2.Dispose()似乎可以释放它的资源,但无法在视频对象上使用Dispose(),因为只有这个对象用于播放视频,所以现在内存消耗要少得多