繁体   English   中英

在 Reactive 中使用的类中的内存不足异常

[英]Out of memory exception in class which is used in Reactive

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

在 Dispose 方法中,我将数据集设置为 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);
        }                        
    }

这个 EmployeeDatas 是 1000 个员工对象的列表。

  EmployeeDatas.ToObservable().Select(x => RunProcess(x).Select(y => new { edata = x, retval = y }))
                .Merge(10)
                .ObserveOn(Scheduler.CurrentThread)
                .Subscribe(x =>
                {
                    SendReportStatus(x.retval.Item1, x.retval);                           
                });

一切正常。 但是当处理第 300 个或以上的员工对象时,有时会在 MyClass 中抛出内存不足异常。

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

这里有什么问题。

鉴于您那里没有太多代码,我不确定。 从我可以看到的是,当您认为会发生时,不会调用您的一次性清理。 假设 MyClass 在 LongRunMethods 中填充 DataTables,那么您实际上永远不会清理。

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

尝试将上述内容替换为...

IObservable<string> RunProcess(Employee emp)
{  
   return Observable.Using(() => new MyClass(), p => p.LongRunMethods(emp.Code), scheduler.ThreadPool);
}

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

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

但是,您显然有泄漏。 遇到此类问题时,我建议在您的代码上运行内存分析器。 这是深入了解问题的最快方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM