给公司弄了个服务自动同步数据,但是占用的内存怎么越来越大了,加了        GC.Collect();
           
这个也不行,不到几个小时内存就大的吓人了。下面是代码try
{
       object[] ob = new object[3];
                    DataTable dTable = GetTableBySql("select * from TB  ");
                    if (dTable.Rows.Count > 0)
                    {
                        DataSet dSet = new DataSet("tb");
                        dSet.Tables.Add(dTable);
                        ob[0] = dSet;
                        ob[1] = "1";
                        ob[2] = "2";
                        object Reslut = WebServiceHelper.InvokeWebService(url, "METHOD", ob);
                        if (Convert.ToInt32(Reslut) > 0)
                        {
                            ArrayList list = new ArrayList();
                            foreach (DataRow dRow in dTable.Rows)
                            {
                                if (!list.Contains(dRow["T1"].ToString()))
                                {
                                    list.Add(dRow["T1"].ToString());
                                    string sqlText = "update TB SET T1="+dRow["T1"].ToString();                                    ExeSql(sqlText);
                                }
                            }
                          
                        }
}
catch()
 finally
            {
                GC.Collect();
            }                     上面的字段我替换了,这个代码有问题吗
              

解决方案 »

  1.   

    你调用GC.Collect();这个代码并不会理解启动垃圾回收的,你可以使用:GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();最好自己主动调用Dispse进行释放
      

  2.   

    更详细的垃圾回收内容可以看看CLR via C#中的介绍
      

  3.   


    注意使用using , 让它自动clean up
    using (DataSet set = new DataSet("office"))
    {
        // Put code that adds stuff to DataSet here.
        // ... The DataSet will be cleaned up outside the block.
    }using (DataTable table = new DataTable())
    {
    }最主要的,select * from TB 假设有10万条,是不是循环执行10万次ExeSql()
    循环执行开销极大
    不能考虑拼一个sql 执行么? 比如1000条拼成一个SQL, 执行一次ExeSQL()

      

  4.   

    object Reslut = WebServiceHelper.InvokeWebService(url, "METHOD", ob);
    这个你再看看是不是单例模式,最好是单例
      

  5.   

    string sqlText = "update TB SET T1="+dRow["T1"].ToString();这样相当于只执行了最后一次的更新啊
      

  6.   

    object Reslut = WebServiceHelper.InvokeWebService(url, "METHOD", ob);
    以前也这么干过,这货就是吃内存的主。每调一次他要重新实列一次。所以不要用动态方式去调WebService.
    老实的用引用的方式吧,内存会少很多。