我有一个应用程序需要检查db每30secons以检查特定记录是否已更新。我使用后台线程。问题是当我在内存分析器中检查时,应用程序的内存使用量不断增加。 这是代码
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;
}
}
答案 0 :(得分:1)
根据提供的信息,您无法回答您的问题。但是,要解决内存泄漏问题,您可以选择以下几种方法:
如果删除线程执行的代码,内存使用量是否会消失?如果没有,那么你必须在代码中的其他地方寻找泄漏。
很可能泄漏不是托管内存,因为它是垃圾回收。您可以通过监视性能计数器 .NET CLR内存 - &gt;来验证这一点。所有堆中的#个字节。如果这个计数器在你的程序运行时显着增加,你就会“泄漏”托管内存,因为你有一些活跃的数据结构,这种结构在不符合垃圾收集条件的情况下不断增长。
假设您排除了管理的“泄漏”,那么您将不得不寻找无管理的泄漏。您是否编写了调用某些需要清理的互操作API?在您的代码中,唯一的可能性似乎是CheckRecord
您应该检查以了解这是否是泄漏的来源。
查看您的代码,似乎您有错误或存在拼写错误:
public void Check() {
bool isUpdate = false;
while (isUpdate) {
...
}
}
由于isUpdate
为false
,因此永远不会输入while循环,Check
将立即返回终止该帖子。
答案 1 :(得分:0)
您忘记在Dispose()
返回的DataTable
上致电GetData()
。这是一个很好的答案,与您需要致电Dispose()
:
答案 2 :(得分:0)
问题是你没有处理由
创建的实例ss=temp.CreateChannel();
因为创建的实例实现了IDisposable接口,所以一旦不需要实例,就必须(必须)调用Dispose()方法。您可以阅读更多here
特别注意using
关键字,以帮助您处理实例