订阅控制器中的事件时,是否需要取消订阅?不会取消订阅导致内存泄漏?为什么/为什么不呢?
[HttpPost]
public JsonResult Process(string data)
{
DataProcessor.Notify += (sender, args) =>
{
result = JsonConvert.SerializeObject(args);
};
.. // do other work
return Json(result );
}
答案 0 :(得分:2)
首先,IMO最好和最安全的做法是始终取消订阅。
在这个特定的场景中,你绝对应该取消订阅,因为你的控制器的寿命比你(我猜)静态DataProcessor
类的寿命短。每当一个短命的对象订阅一个长寿命的对象时,它很可能会导致内存泄漏,因为长对象的事件委托列表将保存对你的短生命对象的引用。
我建议您取消订阅控制器的Dispose
方法。
如果DataProcessor
不是静态类,而是控制器中的字段,则必须检查该对象的范围。如果它是这个控制器实例的专用实例,那么你可以省略取消订阅,因为这两个对象很可能是GCd在一起。