如何在fromClosed事件中自动处理托管和非托管对象?

时间:2013-08-23 11:49:07

标签: c# entity-framework dynamic reflection unmanaged

我正在提高拥有200多个winForms的巨大HIS应用程序的速度和资源使用率,他们使用这样的entityContext:

private void someMethod()
{
    var context = new entityContext();
    var qry = context.someTable.Where(x=>x.condition);//bring thousands of records
    ...
    ... do some thing with result

    ...
    //EOF method. here is problem :
    /*
     * is context will be free all the records that brings to ram 
     * in the end of method without using  context.Dispose()?
     * i think NO!
     */
}

有没有办法找到在表单中创建的所有entityContext对象并处理它们?

如果我在winForms中使用已关闭事件this.Dispose(true);是否足以处置所有这些事件?

public class myForm : System.Windows.Forms.Form
{
    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);

        /*
         * TODO: 
         *      find all entityContext objects and dispose them
         */ 

        this.Dispose(true);
    }
}

我没有时间编辑所有代码以包装entityContext子句中的所有using{}个对象,或手动添加context.Dispose()给他们等等...

我正在寻找一种方法在OnClosed()事件中处理所有这些可能吗?

1 个答案:

答案 0 :(得分:0)

建议的方法是将所有context个对象包装在using{}子句中。这样,它们将在退出使用时自动处理。另外,规范是使用短期上下文对象。

据我所知,在.NET中(至少不容易)搜索DbContext(或任何类型的)的所有实例的反射都是不可能的。即使有可能,反思也会影响你的表现。

将上下文对象作为存储库中的单例(如果已使用此模式)也可以帮助您处理它们,尤其是在您的存储库正在实现IDisposable时。