解决方案 »

  1.   

    判断是否会被回收的依据是:是否有人引用它~因为List<MyStruct> structList; 一直存在
    所以在里面的对象也会一直存在 aStruct也会存在(如果aStruct 引用了aString,那么aString也会一直存在)
    当然如果它被RemoveAt出List了  就没有人引用了~
    那么下次GC的时候它就要挂了~我不知道你Remove的条件会移除多少~ 
    看代码就是2秒中创建一个对象,并且这个对应一直被structList引用着~很安全,死神动不了它~
    Console.WriteLine(structList.Count);//你可以不断第打印,看看有多少个对象
    Thread.Sleep(2000);
      

  2.   

    每次remove一个对象。
    因为设备是固定的,所以list的大小最后肯定是固定的(断点进去确认过)。
    假设,那个aString:aStruct.Name = aString.SubString(0,1);
    那么会有风险吗?
      

  3.   

    另外如果不使用remove,add,,,改为list[i] = aStruct,那么原先的对象会不会被回收,纠结啊~
      

  4.   

    今天发现了一个新问题,连接数据库时报错,说系统内存已满,无法分配连接什么的。我在程序中连接数据库已使用了using,为何还会报错?
    using(SqlConnection conn = new SqlConnection)
      

  5.   

    [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet =
    System.Runtime.InteropServices.CharSet.Ansi, SetLastError = true)]
            public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize);
            /// <summary>
            /// 释放内存
            /// </summary>
            public void ClearMemory()
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                {
                    SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
                }
            }可以线程  循环清理
      

  6.   

    这个已经写进程序了,30分钟会调用一次。能回答下sql连接的问题么?具体看上面回复,谢谢!
      

  7.   

    另外如果不使用remove,add,,,改为list[i] = aStruct,那么原先的对象会不会被回收,纠结啊~只要原来的对象没有在其他地方被引用,那么就会被回收,而且你定义的是struct,会随着堆栈的清理回收地更及时
    但是要注意struct不宜用来保存较大的对象看了一下你的程序,对相同标识的对象,你采用的是remove然后add
    为何不是find然后update?
    频繁的remove和add会影响性能,因为内存需要频繁的回收和分配,碎片也可能会增多,加重GC的负担
      

  8.   

    最后的解决方法:
    使用6楼所说的方法,间隔10分钟调用一次。
    在代码的关键线程中添加GC.Collect(); 。
    运行之后,程序初始占用内存为5M到6M之间,间隔一段时间会恢复6M到7M之间。
    总体来说还算稳定,虽然有时候会暴增到12M左右。
    结贴了,谢谢各位。