如何在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()
事件中处理所有这些的方法,这些可能吗?
推荐的方法是将所有context
对象包装在using{}
子句中。这样,它们将在退出使用时自动处理。此外,规范是使用短期上下文对象。
据我所知,在.NET中,使用反射搜索DbContext
的所有实例(或任何类型)是不可能的(至少不容易)。反思,即使这是可能的,也会影响你的表现。
在存储库中将上下文对象作为singleton(如果使用了这种模式)也可以帮助您处理它们,尤其是当您的repo正在实现IDisposable
时。