如何在fromClosed事件上自动处置托管和非托管对象

本文关键字:对象 fromClosed 事件 | 更新日期: 2023-09-27 18:28:50

我正在提高一个庞大的HIS应用程序的速度和资源使用率,该应用程序有200多个winForms,它们使用如下实体上下文:

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 Closed事件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()事件中处理所有这些的方法,这些可能吗?

如何在fromClosed事件上自动处置托管和非托管对象

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

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

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