订阅MVC控制器中的事件

时间:2016-11-30 16:02:18

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

订阅控制器中的事件时,是否需要取消订阅?不会取消订阅导致内存泄漏?为什么/为什么不呢?

    [HttpPost]
    public JsonResult Process(string data)
    {
        DataProcessor.Notify += (sender, args) => 
        {
            result = JsonConvert.SerializeObject(args);
        };

        .. // do other work

        return Json(result );
    }

1 个答案:

答案 0 :(得分:2)

首先,IMO最好和最安全的做法是始终取消订阅。

在这个特定的场景中,你绝对应该取消订阅,因为你的控制器的寿命比你(我猜)静态DataProcessor类的寿命短。每当一个短命的对象订阅一个长寿命的对象时,它很可能会导致内存泄漏,因为长对象的事件委托列表将保存对你的短生命对象的引用。

我建议您取消订阅控制器的Dispose方法。

如果DataProcessor不是静态类,而是控制器中的字段,则必须检查该对象的范围。如果它是这个控制器实例的专用实例,那么你可以省略取消订阅,因为这两个对象很可能是GCd在一起。