日期:2014-05-18  浏览次数:21184 次

BackGroundWorker 组件 内存释放问题

C# code

Class1自定义类 实现了IDisposable 接口

主要资源对象占用如下
Dictionary<string,MemoryStream> Files=new Dictionary<string,MemoryStream>(20);


接口实现如下

private bool IsDispose = false;

        /// <summary>
        /// 释放所有占用的资源
        /// </summary>
        public void Dispose()
        {
            if (!IsDispose)
            {
                foreach (var v in files)
                {
                    v.Value.Close();
                    v.Value.Dispose();
                }
                Files.Clear();
                Files = null;
                IsDispose = true;
            }
        }

***************以上是定义********************************************以下是应用*********************


BackGroundWorker bgjob=new BackGroundWorker();
his.bgjob.WorkerReportsProgress = true;
....
bgjob.RunWorkerAsync();

DoWork()
{
   using(Class1 c1=new Class1())
   {
      执行一些操作。。。
      内存迅速涨到150-160M


    }//此处使用using语句块 无效果内存仍然在 150M左右

     GC.Collect();//此处调用GC默认 的东东 无效果

}



直到 bgjob 的Completed事件之后 内存仍让 居高不下,
调用多次则出现 内存继续上升  也就是说 我发现我的MemoryStream根本没有释放。。。

求指点。。。







------解决方案--------------------
内存的释放与否,即使你有用Collect也不能直接释放
------解决方案--------------------
1.MemoryStream已经实现了IDisposable接口,所以你用的时候应该
C# code

using (MemoryStream stream = new MemoryStream()){ …… }

------解决方案--------------------
我的意思是既然你一直要用MemoryStream,就不要释放它,直到使用结束后再手动Close。

另外不知道WeakReference能不能帮到你
http://msdn.microsoft.com/zh-cn/library/system.weakreference.aspx
------解决方案--------------------
需要加上析构函数

~Class1()
{
Dispose(false);
}