必须取消订阅作为代表的活动吗?

时间:2012-08-21 10:20:02

标签: c# events

当用户按下按钮时,我想使用这个小上下文菜单:

private ContextMenuStrip TaskMenu()
{
    ContextMenuStrip Result = new ContextMenuStrip();
    Result.Items.Add("Select task to start:");
    Result.Items.AddRange(
        System.IO.Directory.GetFiles("C:\\Settings\\Tasks", true), "*.tsk")
            .Select(qF => new ToolStripMenuItem(System.IO.Path.GetFileNameWithoutExtension(qF)) { Tag = qF, Checked = qF == this.TaskFile })
            .ToArray());
    Result.Items.Add("Cancel");
    Result.ItemClicked += new ToolStripItemClickedEventHandler(
        delegate(object s, ToolStripItemClickedEventArgs ev) { StartScan((string)ev.ClickedItem.Tag); });
    return Result;
}

但是,我不应该因为我从未取消订阅此事件。正确?

2 个答案:

答案 0 :(得分:1)

这里应该没有问题。在方法内部创建Result,因此不可能将相同的事件处理程序连接两次。

当对Result的最后一次引用超出范围时,它就有资格进行垃圾回收。只要此方法之外没有任何内容保留对Result的永久引用,当收集垃圾时,它和对代理的引用都将被清除。

答案 1 :(得分:0)

  

我不应该因为我从未取消订阅此事件,对吗?

如果您需要在某个时刻取消活动,那么这不是正确的方法。解决这个问题的方法是引用处理程序,以便稍后取消订阅。

如果你纯粹从内存泄漏的角度来担心,那就不要了。如果您的ContextMenuStrip是GC,那么您的代表也将如此。