window服务内存不能回收?
给公司弄了个服务自动同步数据,但是占用的内存怎么越来越大了,加了 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();
} 上面的字段我替换了,这个代码有问题吗
[解决办法]
更详细的垃圾回收内容可以看看CLR via C#中的介绍
[解决办法]
注意使用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()
[解决办法]
object Reslut = WebServiceHelper.InvokeWebService(url, "METHOD", ob);
以前也这么干过,这货就是吃内存的主。每调一次他要重新实列一次。所以不要用动态方式去调WebService.
老实的用引用的方式吧,内存会少很多。