2012-01-09 2 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.

Редактировать в ответ на обновление Business Layer -

Вы можете обернуть методы в using блоков, как это:

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

Привет, как я могу избавиться от datacontext? У меня есть отдельный класс на моем бизнес-уровне. плохо добавьте его через некоторое время. – anonymous1110

+0

Вы можете просто вызвать метод 'datacontext.Dispose' - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.dispose.aspx – keyboardP

+0

привет , я добавил свой класс бизнес-уровня. Пожалуйста, взгляните на это спасибо. – anonymous1110

3

Присвоить обнуляет к переменным ссылающихся ваших объектов, использование GC.Collect(); для принудительного сбора мусора. Возможно, вам придется звонить ему дважды подряд, чтобы ускорить доступ к незаметным объектам через этот процесс.

+0

tblCashExpenses = null; затем il добавить GC.COllect() 2x? на моем блоке try? – anonymous1110

+0

@ anonymous1110 Да, посмотрим, поможет ли это. – dasblinkenlight

-1

Установите объект нуль, а затем вызвать:

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

+0

Это не сработает, потому что один вызов GC.Collect() просто перемещает объект в следующее поколение. Нет никакого способа, чтобы гарантировать, что GC.Collect() даже что-то делает .. –

Смежные вопросы