We don't always remember what we've wired up though.  If you give us a delegate 
which matches the type exactly we'll just go ahead and hook it up (to avoid 
adding an extra level of indirection).  Only if you give us some random 
callable object will we remember it.  It'd be easy enough for us to remember 
but I wonder if this is really a good idea.

What if someone else has subscribed to the event?  If you have the ability to 
clear the events then you could cause someone elses subscription to go away.  
Maybe you "know" that no one else will have subscribed but it does seem like 
this breaks the encapsulation of events.

I do think we have the event leaks fixed (we hold no strong references at all 
now).  To trackl down leaks here I'd suggest using windbg & SOS to track down 
the remaining references.  You can !DumpHeap to list the entire heap, find the 
object type you think is keeping everything alive, and then do !GCRoot on its 
address and see who's keeping it alive.

Alternately you could use the weak event pattern.

> -----Original Message-----
> From: [EMAIL PROTECTED] [mailto:users-
> [EMAIL PROTECTED] On Behalf Of Michael Foord
> Sent: Tuesday, December 02, 2008 11:49 AM
> To: Discussion of IronPython
> Subject: Re: [IronPython] Event unhooking and IPy2
>
> Marty Nelson wrote:
> > We've had probably with memory leaks on Windows Form subscribed menu
> > item clicks, just with plain vanilla C#.
> >
> >
> Ok - it may well not be the fault of IronPython. (Certainly some event
> handlers don't cause us problems whilst others do). On the other hand,
> as IronPython *is* keeping track of all the handlers we add, an easy
> interface to unhook them all would be extremely useful.
>
> Michael Foord
>
> > Check out this link http://www.bobpowell.net/eventsubscribers.htm
> (There
> > are some additional steps for System.Windows.Forms.Component), and
> > here's some sample code I wrote in C# that you could leverage:
> >
> >     [TestClass]
> >     public class UnhookEventsTests
> >     {
> >         private class Item
> >         {
> >             public event EventHandler Clicked;
> >
> >             public void FireEvent()
> >             {
> >                 if(Clicked != null)
> >                 {
> >                     Clicked(this, EventArgs.Empty);
> >                 }
> >             }
> >         }
> >
> >         [TestMethod]
> >         public void UnhookEvents()
> >         {
> >             Item item = new Item();
> >             item.Clicked += Clicked;
> >             item.Clicked += Clicked2;
> >
> >             item.FireEvent();
> >
> >             Assert.AreEqual(2, callCount_);
> >
> >             FieldInfo field = typeof (Item).GetField("Clicked",
> > BindingFlags.NonPublic | BindingFlags.Instance);
> >             Delegate del = (Delegate) field.GetValue(item);
> >             Delegate[] list = del.GetInvocationList();
> >
> >             Assert.AreEqual(2, list.Length);
> >
> >             //This works:
> >             //foreach (Delegate d in list)
> >             //{
> >             //    item.Clicked -= (EventHandler) d;
> >             //}
> >
> >             //This is more generic and avoids the cast to the
> specific
> > handler type
> >             EventInfo eventInfo = typeof (Item).GetEvent("Clicked");
> >             foreach (Delegate d in list)
> >             {
> >                 eventInfo.RemoveEventHandler(item, d);
> >             }
> >
> >             item.FireEvent();
> >
> >             Assert.AreEqual(2, callCount_);
> >         }
> >         private int callCount_;
> >         private void Clicked(object sender, EventArgs e)
> >         {
> >             callCount_++;
> >         }
> >
> >         private void Clicked2(object sender, EventArgs e)
> >         {
> >             callCount_++;
> >         }
> >     }
> >
> > -----Original Message-----
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] On Behalf Of Kamil
> > Dworakowski
> > Sent: Saturday, November 29, 2008 1:16 PM
> > To: Discussion of IronPython
> > Subject: Re: [IronPython] Event unhooking and IPy2
> >
> > On Fri, Nov 28, 2008 at 11:39 AM, Michael Foord
> > <[EMAIL PROTECTED]> wrote:
> >
> >> Just as a follow up to this - the reason for the hack below is that
> >> subscribing to events from IronPython is still causing our UI
> objects
> >>
> > (and
> >
> >> their whole object graphs) to not be garbage collected.
> >>
> >
> > To be fair, we have no reason to belive it is IronPython's fault. The
> > bug that event handlers would prevent garbage collection was fixed,
> > and we were able to remove *some* of the event nuking.
> > _______________________________________________
> > Users mailing list
> > Users@lists.ironpython.com
> > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> >
> > =======
> > Notice: This e-mail message, together with any attachments, contains
> > information of Symyx Technologies, Inc. or any of its affiliates or
> > subsidiaries that may be confidential, proprietary, copyrighted,
> > privileged and/or protected work product, and is meant solely for
> > the intended recipient. If you are not the intended recipient, and
> > have received this message in error, please contact the sender
> > immediately, permanently delete the original and any copies of this
> > email and any attachments thereto.
> > _______________________________________________
> > Users mailing list
> > Users@lists.ironpython.com
> > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> >
>
>
> --
> http://www.ironpythoninaction.com/
> http://www.voidspace.org.uk/blog
>
>
> _______________________________________________
> Users mailing list
> Users@lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
Users mailing list
Users@lists.ironpython.com
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to