0

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

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;
}

但是,我不应该这样做,因为我从不取消订阅该活动。正确的?

4

2 回答 2

1

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

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

于 2012-08-21T10:26:53.047 回答
0

我不应该因为我从不取消订阅活动,对吧?

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

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

于 2012-08-21T10:34:58.273 回答