2012-01-09 20093 views
1

如何强制对象在使用后进行处理以释放内存?而且,你如何强制GC收集?如何强制处理对象/ GC

这是我的保存代码。我注意到,每次执行这个函数时,我的内存消耗都会增加,最终会在几次命中后导致内存不足错误。

protected void btnSaveEmptyOC_Click(object sender, EventArgs e) 
{ 


    try 
    { 

     if (ViewState["ServiceDetailID"].ToString() != null) 
     { 
      CashExpense tblCashExpenses = new CashExpense(); 
      Guid CashExpensesID = Guid.NewGuid(); 

      tblCashExpenses.CashExpensesID = CashExpensesID; 


      tblCashExpenses.ServiceDetailsID = new Guid(ViewState["ServiceDetailID"].ToString()); 

      tblCashExpenses.Description = txtDescriptionEmptyOC.Text; 
      tblCashExpenses.Quantity = Decimal.Parse(txtQTYEmptyOC.Text); 
      tblCashExpenses.UnitCost = Decimal.Parse(txtUnitCostEmptyOC.Text); 
      tblCashExpenses.CreatedBy = User.Identity.Name; 
      tblCashExpenses.DateCreated = DateTime.Now; 
      tblCashExpenses.CashExpensesTypeID = "OTHER"; 

      CashExpenses_worker.insert(tblCashExpenses); 
      CashExpenses_worker.submit(); 
      //Clear items after saving 
      txtDescriptionEmptyOC.Text = ""; 
      txtQTYEmptyOC.Text = ""; 
      txtUnitCostEmptyOC.Text = ""; 


      ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOC2, "SaveEmptyOC", this.Page); 
      MyAuditProvider.Insert(this.GetType().ToString(), ViewState["MarginAnalysisID"].ToString(), MessageCenter.Mode.ADD, MessageCenter.CashExpenseMaintenace.InsertOC2, Page.Request, User); 
      divOtherCost.Visible = false; 
      grd_othercost.Visible = true; 
      btnaddothercost.Visible = true; 

      tblCashExpenses = null; 
     } 
     else 
     { 
      ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.SaveServiceDetailOC, "SaveEmptyOC", this.Page); 
     } 
    } 
    catch 
    { 
     ValidationMessage.ShowValidationMessage(MessageCenter.CashExpenseMaintenace.InsertOCError, "SaveEmptyOC", this.Page); 
    } 

    finally 
    { 
     //Rebinds the Grid 
     populategrd_othercost(); 
     Dispose(); 
     GC.SuppressFinalize(this); 
    } 
} 

这里是我的业务层类

public class CashExpensesBL 
{ 
    CEADataStoreDataContext CashExpensesDB = new CEADataStoreDataContext(); 

    public IEnumerable<CashExpense> get() 
    { 
     return CashExpensesDB.CashExpenses; 
    } 
    public IEnumerable<CashExpense> get(Expression<Func<CashExpense, Boolean>> express) 
    { 
     return CashExpensesDB.CashExpenses.Where(express); 
    } 
    public void insert(CashExpense item) 
    { 
     CashExpensesDB.CashExpenses.InsertOnSubmit(item); 
    } 
    public void delete(CashExpense item) 
    { 
     CashExpensesDB.CashExpenses.DeleteOnSubmit(item); 
    } 
    public void deleteDC(Guid servicedetailid) 
    { 
     CashExpensesDB.sp_deleteDefaultCost(servicedetailid); 
    } 
    public void submit() 
    { 
     CashExpensesDB.SubmitChanges(); 
    } 
} 

回答

3

你应该处理您的DataContext。我看不到它在任何地方被移除,因此连接将保持打开状态,并且可能会引用参考(阻止GC拾取它们)。这可能是导致问题的原因。如果您不想手动处理,则可以在using区块内执行交易。

编辑回应业务层更新 -

你可以用在using块的方法是这样的:

public void insert(CashExpense item) 
{  
    using(CEADataStoreDataContext CashExpensesDB = new CEADataStoreDataContext()) 
    { 
     CashExpensesDB.CashExpenses.InsertOnSubmit(item); 
     CashExpensesDB.SubmitChanges(); 
    } 
} 
+0

嗨,我该如何处理datacontext?我在业务层上有一个单独的课程。在短时间内添加它.. – anonymous1110 2012-01-09 02:45:12

+0

您可以简单地调用'datacontext.Dispose'方法 - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.dispose.aspx – keyboardP 2012-01-09 02:48:09

+0

hi ,我已经添加了我的业务层类。请看看它谢谢。 – anonymous1110 2012-01-09 02:49:28

3

分配空变量引用你的对象,使用GC.Collect();强制垃圾收集。您可能需要连续调用两次以加速整个过程中的不可访问对象。

+0

tblCashExpenses = null;然后添加GC.COllect()2x?在我的尝试块? – anonymous1110 2012-01-09 02:43:25

+0

@ anonymous1110是的,看看这是否有帮助。 – dasblinkenlight 2012-01-09 02:54:55

-1

设置对象为空,则调用:

GC.Collect的(); GC.WaitForPendingFinalizers();

+0

这不起作用,因为一个GC.Collect()调用只是将对象移动到下一代。没有办法,保证GC.Collect()甚至可以做一些事情.. – 2017-11-23 09:07:59