我在我的项目中使用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
时清除实例答案 0 :(得分:2)
因为counter
被标记为static
,所以它将在应用程序的整个生命周期中持续存在(与特定的类实例无关)。如果这不是所需的结果,并且您希望每个类的实例都有counter
的新实例,请删除static
关键字。
private int counter = 0;
这将为counter
的每个实例创建EditAttributeViewModel
的新实例。
答案 1 :(得分:2)
与C ++不同,您无法按需释放内存。 Dispose模式用于释放非托管资源(文件处理程序,连接或图片,这些资源不受管理,读取:保留在.Net内存管理之外以及使用IntPtr
的任何内容)。
您可以做的就是,将所有引用设置为null并在类中的所有一次性类型上调用.Dispose()
,然后等待,直到垃圾回收它们为止。
根据您的应用程序如何利用内存,这可能迟早会发生。如果您的应用程序经常实例化和取消引用对象,这可能会更快发生,如果您的应用程序不需要更长时间。
你不应该依赖于终结器(看起来像C ++中的解构器)被调用或何时被调用。当它清理时,GC会调用它。但只有你没有压制它(你通常在Dispose方法中做)。