[英]PDF*.tmp file are not deleted and Out of Memory Exception when CacheToDisk is used
[英]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.