OutOfMemory exception when override OnAddEventHooks

OutOfMemory exception when override OnAddEventHooks

Old forum URL: forums.lhotka.net/forums/t/7263.aspx


tchimev posted on Monday, July 13, 2009

I have business object hierarchy like this:

masterBB
-- childBB
-- childBLB
---- childBB

I override OnAddEventHooks method in my base list class, which inherits BLB.
I hooked for child edit level changes.
IBaseObjectEditLevel is the interface that holds the event.

        protected override void OnAddEventHooks(BB item)
        {
            base.OnAddEventHooks(item);

            IBaseObjectEditLevel child = item as IBaseObjectEditLevel;
            if (child != null)
            child.ChildEditLevelChanged += new EventHandler<ChildEditLevelEventArgs>(BLB_ChildEditLevelChanged);
        }

If I call masterBB.BeginEdit() more then 5 times I get an OutOfMemory exception.
ChildEditLevelChanged is a custom event, something like ChildChanged but with different args.

Is this good place to hook for my child event?

tchimev replied on Wednesday, July 15, 2009

I found the solution.

My mistake was that my BB implemented my custom event handler without the
attributes NotUndoable and NonSerialized.
Without those attributes my objects result in circular references.

        [NonSerialized]
        [NotUndoable]
        private EventHandler<SomeEventArgs> _onSomethingChanged;

        public event EventHandler<SomeEventArgs> OnSomethingChanged
        {
            add
            {
                _onSomethingChanged= (EventHandler<SomeEventArgs>)
                  System.Delegate.Combine(_onSomethingChanged, value);
            }
            remove
            {
                _onSomethingChanged= (EventHandler<SomeEventArgs>)
                  System.Delegate.Remove(_onSomethingChanged, value);
            }
        }

hope this will help someone

ajj3085 replied on Thursday, July 16, 2009

You can also look at how Csla hooks up some events, where it keeps seperate lists of handlers which can be serialized and those that don't, if that might be important.

Copyright (c) Marimer LLC