后台线程增加内存使用量

时间:2013-08-13 09:09:58

标签: .net multithreading winforms

我有一个应用程序需要检查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;
    }
    }

3 个答案:

答案 0 :(得分:1)

根据提供的信息,您无法回答您的问题。但是,要解决内存泄漏问题,您可以选择以下几种方法:

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

  • 很可能泄漏不是托管内存,因为它是垃圾回收。您可以通过监视性能计数器 .NET CLR内存 - &gt;来验证这一点。所有堆中的#个字节。如果这个计数器在你的程序运行时显着增加,你就会“泄漏”托管内存,因为你有一些活跃的数据结构,这种结构在不符合垃圾收集条件的情况下不断增长。

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

查看您的代码,似乎您有错误或存在拼写错误:

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

由于isUpdatefalse,因此永远不会输入while循环,Check将立即返回终止该帖子。

答案 1 :(得分:0)

您忘记在Dispose()返回的DataTable上致电GetData()。这是一个很好的答案,与您需要致电Dispose()

的原因有关

Do I need to call Dispose() on managed objects?

答案 2 :(得分:0)

问题是你没有处理由

创建的实例
ss=temp.CreateChannel();

因为创建的实例实现了IDisposable接口,所以一旦不需要实例,就必须(必须)调用Dispose()方法。您可以阅读更多here

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