2016-02-08 37 views
0

我在我的項目中使用MVVM。 首先在所有看到編輯動作:如何在完成時剝奪類的實例操作

[HttpGet] 
    public async virtual Task<ActionResult> Edit(int code) 
    { 
     var attributeModel = await _attributeService.GetAsync(code); 
     EditAttributeViewModel attributeViewModel = mapper.Map(attributeModel, new EditAttributeViewModel()); 
     return View(attributeViewModel); 
    } 
在視圖模型

我算實例是這樣的:

public class EditAttributeViewModel 
{ 
    private static int counter = 0; 
    public EditAttributeViewModel() 
    { 
     Interlocked.Increment(ref counter); 
    } 
    ~EditAttributeViewModel() 
    { 
     Interlocked.Decrement(ref counter); 
    } 
} 

再次獲得Edit行動和變化控制器,復出時說Edit動作,當看到counter它總是當我在頁面之間移動時。我不想使用太多的內存,因爲我這樣做我OverrideDispose控制器中的方法是這樣的:

protected override void Dispose(bool disposing) 
    { 
     base.Dispose(disposing); 

    } 

但它dost chnage和計數器總是增加。

我怎樣才能清除實例Finshed ActionMethod

+2

'counter'是'static'。它只有一個實例。 –

+0

whan我編輯一行5次,計數器= 5,而變化控制器和againg復出再次編輯該行,計數器增加到6 ... –

+0

是的,我知道 - 因爲它的'靜態'! –

回答

2

與C++不同,您無法按需自由釋放內存。 Dispose模式用於釋放非託管資源(不受管理的文件處理程序,連接或圖片,讀取:保留在.Net內存管理之外,以及任何使用IntPtr的內容)。

所有你能做的就是,將所有的引用爲null,並呼籲所有一次性類型.Dispose()在你的類,然後等待,直到垃圾收集接他們回家。

根據您的應用程序如何利用內存,這可能遲早會發生。如果你的應用程序經常實例化和不引用對象,這可能會更快發生,如果你的應用程序沒有,它可能需要更長的時間。

不應該取決於終結器(看起來像C++中的解構器)被稱爲或何時。 GC在清理它時會調用它。但是,只有當你沒有壓制它(你通常在Dispose方法中做的)。

2

時,由於counter被標記爲static,它會持續整個應用程序(不可知類特定實例)的生命週期。如果這不是理想的結果,並且您想爲該類的每個實例新增一個counter實例,請刪除static關鍵字。

private int counter = 0; 

這會爲EditAttributeViewModel每個實例創建的counter一個新的實例。

+0

非常感謝... –

相關問題