完成Action后如何破坏类的实例

时间:2016-02-08 06:39:35

标签: c# asp.net-mvc asp.net-mvc-4 mvvm

我在我的项目中使用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);
    }
ViewModel中的

我像这样计算实例:

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

完成Edit操作并更改控制器后,再次返回到Edit操作,当看到counter总是增加时,我在页面之间移动。我不想使用太多的内存,为此,我Override Dispose控制器中的方法如下:

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

    }

但它确实有效,而且反击总是增加。

如何在Finshed ActionMethod

时清除实例

2 个答案:

答案 0 :(得分:2)

因为counter被标记为static,所以它将在应用程序的整个生命周期中持续存在(与特定的类实例无关)。如果这不是所需的结果,并且您希望每个类的实例都有counter的新实例,请删除static关键字。

 private int counter = 0;

这将为counter的每个实例创建EditAttributeViewModel的新实例。

答案 1 :(得分:2)

与C ++不同,您无法按需释放内存。 Dispose模式用于释放非托管资源(文件处理程序,连接或图片,这些资源不受管理,读取:保留在.Net内存管理之外以及使用IntPtr的任何内容)。

您可以做的就是,将所有引用设置为null并在类中的所有一次性类型上调用.Dispose(),然后等待,直到垃圾回收它们为止。

根据您的应用程序如何利用内存,这可能迟早会发生。如果您的应用程序经常实例化和取消引用对象,这可能会更快发生,如果您的应用程序不需要更长时间。

不应该依赖于终结器(看起来像C ++中的解构器)被调用或何时被调用。当它清理时,GC会调用它。但只有你没有压制它(你通常在Dispose方法中做)。

相关问题