当用户按下按钮时,我想使用这个小上下文菜单:
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;
}
但是,我不应该因为我从未取消订阅此事件。正确?
答案 0 :(得分:1)
这里应该没有问题。在方法内部创建Result
,因此不可能将相同的事件处理程序连接两次。
当对Result
的最后一次引用超出范围时,它就有资格进行垃圾回收。只要此方法之外没有任何内容保留对Result
的永久引用,当收集垃圾时,它和对代理的引用都将被清除。
答案 1 :(得分:0)
我不应该因为我从未取消订阅此事件,对吗?
如果您需要在某个时刻取消活动,那么这不是正确的方法。解决这个问题的方法是引用处理程序,以便稍后取消订阅。
如果你纯粹从内存泄漏的角度来担心,那就不要了。如果您的ContextMenuStrip
是GC,那么您的代表也将如此。