【发布时间】:2013-08-13 09:09:58
【问题描述】:
我有一个应用程序需要每 30 秒检查一次 db 以检查特定记录是否已更新。我为此使用后台线程。问题是当我在内存分析器中检查它时,应用程序的内存使用量不断增加。 这是代码
Form1:Base
Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(Check));
t.IsBackground = true;
t.Start();
public void Check() {
bool isUpdate = false;
while (!isUpdate)
{
DataTable _data = CheckRecord();
if (_data.Rows.Count > 0)
{
isUpdate = true;
}
else
{
Thread.Sleep(30000);
}
}
}
public DataTable CheckRecord(){
return CHANNEL.GetData();
}
Form1 继承基础表单
Base:Form
ChannelFactory<ServiceClass> temp= new ChannelFactory<ServiceClass>("AAA");
ServiceClass ss=null;
public ServiceClass CHANNEL
{
get {
if(ss==null)
ss=temp.CreateChannel();
return ss;
}
}
【问题讨论】:
-
首先线程本身需要内存。 可能是持续增加的原因是
CheckRecord。你在创建一个大数据表吗?只要有足够的内存,GC 可能不会收集以前的_data对象。因此,内存中可能有很多DataTable实例,即使它们不再可访问。你能用你的分析器检查这个吗? -
我同意@MatthiasMeid - 你没有明确地销毁你的
DataTable,因此当你执行下一次检查时,你每次都有效地孤立它,如果CG没有'在您下次检查之前点击它,您的内存使用量将继续上升。如果您不使用DataTable,我会从数据库返回计数而不是数据本身。 -
嗯,具体一点,内存分析器告诉你哪些对象没有被垃圾回收?不能是 DataTable 对象。
-
显示
CheckRecord的代码 -
@MartinLiversage 是的,但这并不意味着它会立即被收集。 AFAIK 无法保证对象何时会被 GC'd,GC 只会在下一次扫描时清除“孤立”对象,并且通常仅在需要重新声明 RAM 时触发。因此,它有可能在不需要的时候一直存在(我只是在猜测,我可能是错的)。
标签: .net multithreading winforms