2013-08-23 93 views
-1

我正在提高速度和巨大的HIS應用程序,有超過200點的WinForms資源的利用率和他們使用的EntityContext這樣的:如何自動處理fromClosed事件上的託管和非託管對象?

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

推薦的方法是將所有context對象包裝在using{}子句中。這樣他們將在退出使用時自動處置。另外規範是使用短命的上下文對象。據我所知,在.NET中(至少不是很容易),在DbContext(或任何類型的事件)上搜索反射並不可能。反思,即使這是可能的,也會傷害你的表現。

將上下文對象作爲存儲庫中的單例(如果已經使用此模式)也可以幫助您處理它們,尤其是在您的回購站實施IDisposable時。

+0

我只有一週的時間過去了1天,我不想整週花費在使用上下文對象添加{}或更改代碼以使用Singleton並對其進行測試 – patachi

+1

正如我在我的答案中所述,您無法自動執行此操作與反射。 – idipous