Как заставить выбрасывать объекты / GC - PullRequest
2 голосов
/ 09 января 2012

Как вы заставляете объекты избавляться после использования, чтобы освободить память?И как вы заставляете 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 ]

4 голосов
/ 09 января 2012

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

4 голосов
/ 09 января 2012

Вы должны избавиться от DataContext.Я не вижу его где-либо удаленным, поэтому соединение останется открытым, и ссылки могут быть сохранены (не позволяя GC их забрать).Это может быть причиной проблемы.Если вы не хотите утилизировать вручную, вы можете выполнить транзакцию в блоке using.

Редактировать в ответ на обновление бизнес-уровня -

Вы можете заключить методы в using блоки, например:

public void insert(CashExpense item)
{    
   using(CEADataStoreDataContext CashExpensesDB = new CEADataStoreDataContext())
   {
       CashExpensesDB.CashExpenses.InsertOnSubmit(item); 
       CashExpensesDB.SubmitChanges();
   }
}
0 голосов
/ 21 сентября 2013

Установите для объекта значение null, затем вызовите:

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

...