1

我有一个很大的疑问。问题是我班上的内存不足异常。但这里似乎有些奇怪。我在 dll 中有课程。

 public class MyClass : IDisposible
 {
     List<ClassA> a_classLists = new .....// new instance.
     List<ClassB> b_classLists = new .....// new instance.

     public string Method1(int IDValue)
     {
         // do here some web service call and get some XML data from it.
         // parse the xml.
         // Iterate through a for loop and add each node value to a_classLists
         // Usually contains 10 or 15 items

         Method2();  // from here calling another method
         FinalSaveToDB(); // finally save the data to DB
         return "";
     }

     private void Method2()
     {
         // do here some web service call and get some XML data from it.
         // Iterate through a forloop.
         // parse the xml. [large xml data. ie, image in binary format]
         // For each loop add image binary data and other xml to b_classLists
         // Usually it contains 50 or 60 such large lists.
     }

     private void FinalSaveToDB()
     {
         // using sqlbulkcopy, i am saving the data in the 2 lists to 2 different
         // tables in the DB.
         // Tab lock is mentioned in sqlbulk class.
         // Actually 2 sqlbulkcopy class for 2 lists.
         // Only 1 sql connection opens, then do the sqlbulkcopy. [there is no dataset or datareader]
         // sqlconnection closes. I am using "using" clause for sqlconnection, bulkcopy etc
         // these all are working fine.
     }

     private void Dispose()
     {
         // here nulling everything
         // proxy null
         // all the lists null....
     }
 }

这是我使用响应式框架的 Observable.Start 方法实例化 1000 次的类,如下所示...

  private IObservable<string> SendEmpDetails(Employee emp)
  {
    using (MyClass p = new MyClass())
    {
      return Observable.Start(() => p.Method1(emp.ID), Scheduler.ThreadPool);
    } 
   // here I hope it will call the Dispose and release all objects in the class.
  }

   // This EmployeeLists contains 1000 employee objects
   EmployeeLists.ToObservable().Select(x => SendEmpDetails(x).Select(y => new { emp = x, retval = y }))
                     .Merge(10)
                     .ObserveOn(Scheduler.CurrentThread)
                     .Subscribe(x =>
                     {
                        SendStatus(x.retval.Item1, x.retval);
                     });

即使,为什么我会出现内存不足异常???启动应用程序后,当它处理第 200 个(或以上)MyClass 对象时,它会抛出错误。

我忘了再提一件事,我使用的是 VS 2010 和 C# 4.0(win7,64 位操作系统)。

我需要记录每个活动。[即,我需要了解应用程序经历的每一个过程]。所以我声明了一个类 [MyClass] 级别的私有字符串变量并分配每个进程的详细信息,如“调用此方法”、“从该 Web 服务获取 5 条记录”等。

    logdata = Environment.Newline() + "This method has completed";

所以这里抛出错误,说内存不足,一些评估失败。

所以我从 VS 中的 Options 中关闭了字符串评估复选框。

再次,没有用。

所以我将字符串更改为 StringBuilder 并尝试每次都附加活动字符串。

还是没用。我不明白它有什么问题。

这是因为所有线程都在并行工作,它们交换 MyClass 资源吗???为什么不释放对象???

请在这件事上帮助我。

4

0 回答 0