【问题标题】:Do I need to unsubscribe from dynamic menu item events?我是否需要取消订阅动态菜单项事件?
【发布时间】:2013-12-03 16:57:59
【问题描述】:

我正在动态创建一个包含许多嵌套菜单项的上下文菜单。每次显示上下文菜单时,我都会清除菜单并重新创建菜单项。我是否需要取消订阅这些菜单项点击事件?我在想,当我清除 ContextMenu.Items 列表时,垃圾收集器会拾取菜单项,我不需要担心它们。

void Window_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        if (this.ContextMenu == null)
           ContextMenu = new ContextMenu();
        else
           ContextMenu.Items.Clear();

        AddMenuItemsToContextMenu();
    }

void AddMenuItemsToContextMenu()
{
    //create many nested menu items
    foreach (A in AList)
    {
        MenuItem item = new MenuItem();
        item.Header = A.Label;
        item.Click += MenuItem_Click;
        ContextMenu.Items.Add(item);

        //possibly add more menu items to this menu item
   }
}

【问题讨论】:

    标签: c# events menu


    【解决方案1】:

    当您执行item.Click += MenuItem_Click; 时,MenuItem 包含对您的 Form 的引用,因此一旦您删除了对 ContextMenu.Items.Clear(); 中控件的最后一个引用,垃圾收集器最终将收集位于集合,它还将收集其中创建的事件。

    当发布事件的类是静态对象或对发布对象的意外附加引用被保存在其他地方时,可能会让您陷入困境的事情是,引用链 (additional reference -> object publishing event -> object subscribing to event) 可以保留它最后一个订阅对象的存活时间比预期的要长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-12
      • 2018-07-23
      相关资源
      最近更新 更多