主要工作是 从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);
}我已经把我能想到的都释放掉了,可以内存还是一个劲的往上涨,怎么解决阿
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);
}我已经把我能想到的都释放掉了,可以内存还是一个劲的往上涨,怎么解决阿
catch { } 里continue?没有出来的,出错继续?
LZ用GC.GetTotalMemory查一下,看看占了多少!
有一点可以肯定的是,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(); }
其次准确的释放资源是程序员必须要做的(比如非托管资源)
最后合理的使用内存是程序员必须要做的又一件事情,如果让你的程序使用最少的内存干最多的事情,如果让CLR不会创建太多的内存碎片,这些都需要经验,当然也有一些法则可以遵循。