簡體   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