C# 类中使用的内存不足异常

C# 类中使用的内存不足异常,c#,memory-management,system.reactive,idisposable,C#,Memory Management,System.reactive,Idisposable,在RX框架中使用类时,如何释放类中的资源? 我在C#4.0 lib项目中有一个类,它包含web服务代理、ado.net对象等,我还实现了IDisposable。这个类有一个run-running方法,在这个方法中,我将数据保存到一个dataset中,最后当这个方法完成时,我将dataset保存到DB中 在Dispose方法中,我将dataset设置为null,将其他web服务代理对象设置为null。然而,当这个类在反应式扩展方法中频繁使用时,它抛出内存异常 public class MyClas

在RX框架中使用类时,如何释放类中的资源? 我在C#4.0 lib项目中有一个类,它包含web服务代理、ado.net对象等,我还实现了IDisposable。这个类有一个run-running方法,在这个方法中,我将数据保存到一个dataset中,最后当这个方法完成时,我将dataset保存到DB中

在Dispose方法中,我将dataset设置为null,将其他web服务代理对象设置为null。然而,当这个类在反应式扩展方法中频繁使用时,它抛出内存异常

public class MyClass : IDisposable
 {
     proxy object;
     DataSet object; // This dataset has 2 tables with relation set each other

     public string LongRunMethods(string code)
     {
        // iterrating a for loop...
        // insert new row into the 1st table of dataset in each loop
        // another loop
        // insert new row into the 2nd table of dataset in each loop
        // Bulk save the dataset to Database
        // return string;
      }

      private void Dispose()
      {
         // nulling all the objects...[proxies, datasets, etc

      }
  }
这个类通过创建1000次来使用,如下所示

   IObservable<string> RunProcess(Employee emp)
    {           
       using (MyClass p = new MyClass ())
        {
          return Observable.Start(() => p.LongRunMethods(emp.Code), scheduler.ThreadPool);
        }                        
    }
一切正常。但在处理第300个或以上的employee对象时,有时会在MyClass中引发内存不足异常

我在MyClass中使用dispose方法,它将在完成后释放所有资源。但为什么会出现内存不足的异常呢


这里出了什么问题

我不确定,因为您没有太多的代码。从我所能看到的是,你的一次性清洁并没有在你认为它会被调用的时候被调用。假设MyClass填充LongRunMethods中的数据表,那么实际上您永远不会清理

在MyClass实例化之后,很可能在LongRunMethods启动之前,立即调用Dispose

尝试将上述内容替换为

IObservable<string> RunProcess(Employee emp)
{  
   return Observable.Using(() => new MyClass(), p => p.LongRunMethods(emp.Code), scheduler.ThreadPool);
}
IObservable运行流程(员工emp)
{  
使用(()=>newmyclass(),p=>p.LongRunMethods(emp.Code),scheduler.ThreadPool)返回可观察的;
}

这将在调用OnCompleted()后处理MyClass。

据我所知,您发布的Rx中没有任何内容本身会显示内存泄漏。正如其他人所指出的,您正在查询完成之前处理您的类——如果没有看到更多的代码,很难说会导致什么问题

然而,你显然有漏洞。当遇到这种问题时,我建议对代码运行内存分析器。这是弄清真相的最快方法


如果您没有足够高的Visual Studio版本,则可以下载Visual Studio试用版或任何数量的商业产品。我强烈推荐,因为它非常容易使用,并且有一个非常好的教程。

谢谢。但是使用需要一些其他参数。编译器错误表示使用时没有3个重载。我如何在使用中提到线程池?
IObservable<string> RunProcess(Employee emp)
{  
   return Observable.Using(() => new MyClass(), p => p.LongRunMethods(emp.Code), scheduler.ThreadPool);
}