-1

I have an application which need to check db for every 30secons to check a particular record has updated or not. I use background thread for that. The problem is memory usage of application is continuously increase when I check it in memory profiler. Here is the code

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 inherit base form

Base:Form

ChannelFactory<ServiceClass> temp= new ChannelFactory<ServiceClass>("AAA");
ServiceClass ss=null;

public ServiceClass CHANNEL
{
    get {
        if(ss==null)
            ss=temp.CreateChannel();
        return ss;
    }
    }
4

3 回答 3

1

使用提供的信息无法回答您的问题。但是,要解决内存泄漏问题,您有几个选项:

  • 如果删除线程执行的代码,内存使用量增加会消失吗?如果没有,那么您必须在代码中的其他地方寻找泄漏。

  • 很可能泄漏不是托管内存,因为它是垃圾收集的。您可以通过监视性能计数器.NET CLR Memory -> #Bytes in all Heaps来验证这一点。如果在您的程序运行时此计数器显着增加,则您正在“泄漏”托管内存,因为您有一些活动数据结构不断增长,但没有资格进行垃圾收集。

  • 假设您已经排除了受管理的“泄漏”,那么您将不得不寻找未受管理的泄漏。您的代码是否调用了一些需要您清理的互操作 API?在您的代码中,唯一的可能性似乎是CheckRecord您应该检查以了解这是否是泄漏的来源。

查看您的代码,您似乎有错误或有错字:

public void Check() {
  bool isUpdate = false;
  while (isUpdate) {
    ...
  }
}

因为isUpdate永远false不会进入while循环,并且Check会立即返回终止线程。

于 2013-08-13T09:25:26.853 回答
0

问题是您没有处理由

ss=temp.CreateChannel();

因为创建的实例实现了 IDisposable 接口,所以您应该(必须)在不需要该实例时立即调用 Dispose() 方法。你可以在这里阅读更多

请特别注意using关键字以帮助您处理实例

于 2013-08-13T13:07:48.580 回答
0

您忘记调用返回的Dispose()by 。这是与您需要致电的原因相关的一个很好的答案:DataTableGetData()Dispose()

我需要在托管对象上调用 Dispose() 吗?

于 2013-08-13T11:19:59.303 回答