主要工作是 从ftp下载文件后,将文件的二进制流存放到 数据库中.主要工作代码
while (run)
            { 
                DataContext.Refresh(System.Data.Linq.RefreshMode.KeepChanges);                try
                {
                    REPORTS001 rp = DataContext.REPORTS001s.OrderByDescending(r=>r.date).FirstOrDefault(r => r.status == 0&&r.format=="pdf");                    if (rp == null)
                    {
                       
                        html_Message(string.Format("[{0:yyyy-MM-dd HH:mm:ss}] No Null", DateTime.Now));
                        Thread.Sleep(5000);
                    }
                    else
                    {
                        rp.status = 100;
                        DataContext.SubmitChanges();                        MemoryStream ms = new MemoryStream();
                        try
                        {
                            ms = html.GET(rp.url, rp.GUID);
                            byte[] buffer = new byte[ms.Length];                            ms.Read(buffer, 0, buffer.Length);                            ms.Close();
                            ms.Dispose();                            if (buffer.Length < 50)
                            {
                                Message(string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, "Download Error", DataContext.REPORTS001s.Count(r => r.status == 0)));                                rp.status = 404;
                                DataContext.SubmitChanges();
                                
                                continue;
                            }                            rp.filedata = new System.Data.Linq.Binary(buffer);
                            rp.status = 1;
                            DataContext.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
                            Message(string.Format("[{0:HH:mm:ss}] {2} {1}", DateTime.Now, rp.GUID, DataContext.REPORTS001s.Count(r => r.status == 0)));
                            buffer = null;
                            GC.Collect();
                        }                        catch (System.Data.Linq.ChangeConflictException e)
                        {
                            string log = string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, e.Message, DataContext.REPORTS001s.Count(r => r.status == 0));
                            Message(log);                            rp.filedata = null;
                            rp.status = 2;
                            DataContext.SubmitChanges();
                            continue;
                        }
                        catch (Exception err)
                        {
                            string log = string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, err.Message, DataContext.REPORTS001s.Count(r => r.status == 0));
                            Message(log);                            rp.filedata = null;
                            rp.status = 2;
                            DataContext.SubmitChanges();
                            continue;
                        }
                    }                 
                }
                catch { }
                Thread.Sleep(500);
            }我已经把我能想到的都释放掉了,可以内存还是一个劲的往上涨,怎么解决阿

解决方案 »

  1.   


                    catch { } 里continue?没有出来的,出错继续?
      

  2.   

    DataContext一直保持在内存中,不涨才怪...你不会先写到临时文件中最后一次提交进数据库吗?这种地方用Linq2Sql不是好主意...
      

  3.   

    C#的程序在一定时间内会内存执续上涨,但要相信GC,在必要的时候会回收内存的.如果在一个相当长时间内仍然在涨,再考虑程序问题.
      

  4.   

    有GC.Collect()还占用这么高的话,应该是非托管资源或程序没有释放。
    LZ用GC.GetTotalMemory查一下,看看占了多少!
      

  5.   

    是不是因为DataContext一直在内存中这个就没有办法测试了。但最好还是每次循环New一个。
    有一点可以肯定的是,MemoryStream ms 这个对象你是不能保证能释放掉了的。   MemoryStream ms = new MemoryStream();
                            try
                            {
                                ms = html.GET(rp.url, rp.GUID);
                                byte[] buffer = new byte[ms.Length];                            ms.Read(buffer, 0, buffer.Length);                            //ms.Close(); 放入finally中
                                //ms.Dispose();同上                            if (buffer.Length < 50)
                                {
                                    Message(string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, "Download Error", DataContext.REPORTS001s.Count(r => r.status == 0)));                                rp.status = 404;
                                    DataContext.SubmitChanges();                                continue;
                                }                            rp.filedata = new System.Data.Linq.Binary(buffer);
                                rp.status = 1;
                                DataContext.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);
                                Message(string.Format("[{0:HH:mm:ss}] {2} {1}", DateTime.Now, rp.GUID, DataContext.REPORTS001s.Count(r => r.status == 0)));
                                buffer = null;
                                GC.Collect();
                            }                        catch (System.Data.Linq.ChangeConflictException e)
                            {
                                string log = string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, e.Message, DataContext.REPORTS001s.Count(r => r.status == 0));
                                Message(log);                            rp.filedata = null;
                                rp.status = 2;
                                DataContext.SubmitChanges();
                                continue;
                            }
                            catch (Exception err)
                            {
                                string log = string.Format("[{0:HH:mm:ss}] {3} Error {1}:{2} ", DateTime.Now, rp.GUID, err.Message, DataContext.REPORTS001s.Count(r => r.status == 0));
                                Message(log);                            rp.filedata = null;
                                rp.status = 2;
                                DataContext.SubmitChanges();
                                continue;
                            }
                            finally
                            {
                                //保证ms一定能释放
                                ms.Close();
                                ms.Dispose();                        }
      

  6.   

    关于.NET的内存说了无数遍了。CLR基于一个假设用户的内存无限大,但是又不可能无限大,所以满足一定条件的时候启动垃圾回收机制来回收不再使用的对象。首先要确定的是,内存增长是正常的,一般看托管内存分配(bytes in all heaps)和非托管堆(Available Bytes),他们的增长是否是一致。
    其次准确的释放资源是程序员必须要做的(比如非托管资源)
    最后合理的使用内存是程序员必须要做的又一件事情,如果让你的程序使用最少的内存干最多的事情,如果让CLR不会创建太多的内存碎片,这些都需要经验,当然也有一些法则可以遵循。