This is why I write bugs. So that my powers may never be used for evil.

On Mon, Apr 2, 2012 at 11:21 AM, Stephen Price <step...@perthprojects.com>wrote:

> Now for some reason, my reply has conjured up images of an evil overlord
> with his hand on Micheals brain, sucking out all of his powers...
>
> Hmm... time for another coffee.
>
>
> On Mon, Apr 2, 2012 at 11:19 AM, Stephen Price 
> <step...@perthprojects.com>wrote:
>
>> Your mind is indeed a sponge. Squeeze it and you get all kinds of goodies
>> come out. :)
>>
>>
>> On Mon, Apr 2, 2012 at 11:16 AM, Michael Minutillo <
>> michael.minuti...@gmail.com> wrote:
>>
>>> You're welcome :)
>>>
>>> I often end up with a container class of some description too (like the
>>> following) which makes aggregating these sorts of things very easy. By the
>>> end of the previous project just about every view in our system had a
>>> container and disposed of it when it was destroyed. So much so that we
>>> pushed it into a base class and it became the common pattern for handling
>>> things like bindings, event subscriptions, micro-controllers, etc.
>>>
>>> class Container : IDisposable
>>> {
>>>   private readonly IList<object> _objects = new List<object>();
>>>
>>>   public void Add(object o)
>>>   {
>>>     _objects.Add(o);
>>>   }
>>>
>>>   public void Flush()
>>>   {
>>>     foreach(var obj in _objects.OfType<IDisposable>().Reverse())
>>>       obj.Dispose();
>>>     _objects.Clear()
>>>   }
>>>
>>>   public void Dispose()
>>>   {
>>>     Flush();
>>>
>>>   }
>>> }
>>>
>>> On Mon, Apr 2, 2012 at 10:59 AM, Stephen Price <
>>> step...@perthprojects.com> wrote:
>>>
>>>> So looking at Michael's example, the viewmodel would register the
>>>> object and then in its Dispose method, call the Dispose on the object it
>>>> got back (and kept track of).
>>>>
>>>> understand it, and will file this one away for when I need it. I think
>>>> i'm ok with what I have because the actual class is not static, only the
>>>> Registration and unreg (+ and - operations) are static.
>>>>
>>>> I should have looked before I leapt(posted to list) but had I not, I
>>>> wouldn't have gotten this gem from the sponge that is Michael's mind. So
>>>> glad I did. :)
>>>>
>>>> Thanks!
>>>>
>>>> On Mon, Apr 2, 2012 at 10:37 AM, James Chapman-Smith <
>>>> ja...@chapman-smith.com> wrote:
>>>>
>>>>> Hi Michael,****
>>>>>
>>>>> ** **
>>>>>
>>>>> This is an awesome pattern for solving this problem. I use it myself
>>>>> quite a lot. I think it is perfect for Stephen.****
>>>>>
>>>>> ** **
>>>>>
>>>>> Cheers.****
>>>>>
>>>>> ** **
>>>>>
>>>>> James.****
>>>>>
>>>>> ** **
>>>>>
>>>>> *From:* ozdotnet-boun...@ozdotnet.com [mailto:
>>>>> ozdotnet-boun...@ozdotnet.com] *On Behalf Of *Michael Minutillo
>>>>> *Sent:* Monday, 2 April 2012 11:11
>>>>> *To:* ozDotNet
>>>>> *Subject:* Re: Unhooking events from Handler****
>>>>>
>>>>> ** **
>>>>>
>>>>> In the past I have done something like this:
>>>>>
>>>>> class Disposable : IDisposable
>>>>> {
>>>>>   private readonly Action _action;
>>>>>   public Disposable(Action action)
>>>>>   {
>>>>>     _action = action;
>>>>>   }
>>>>>
>>>>>   public void Dispose()
>>>>>   {
>>>>>     _action();
>>>>>   }
>>>>> }
>>>>>
>>>>> public interface IHandle<TMessage>
>>>>> {
>>>>>     void Handle(TMessage message);
>>>>> }
>>>>>
>>>>> public static class Events
>>>>> {
>>>>>     private static readonly IList<object> _handlers = new
>>>>> List<object>();
>>>>>
>>>>>     public static IDisposable Register(object o)
>>>>>     {
>>>>>         _handlers.Add(o);
>>>>>         return new Disposable(() => _handlers.Remove(o));
>>>>>     }
>>>>>
>>>>>     public static void Raise<TMessage>(TMessage message)
>>>>>     {
>>>>>         foreach(var handler in _handlers.OfType<IHandle<TMessage>>())
>>>>>             handler.Handle(message);
>>>>>     }
>>>>> }
>>>>>
>>>>> That way the registration code returns some kind of "subscription
>>>>> token". Whoever adds the handler is responsible for disposing of the token
>>>>> and therefore cancelling the subscription. There's lots you can do around
>>>>> background threads, error handling, locking (for thread safety) etc. but
>>>>> the above is the basic skeleton I end up using.
>>>>>
>>>>> Michael M. Minutillo
>>>>> Indiscriminate Information Sponge
>>>>> http://codermike.com
>>>>>
>>>>> ****
>>>>>
>>>>> On Mon, Apr 2, 2012 at 9:27 AM, David Walker <rangitat...@gmail.com>
>>>>> wrote:****
>>>>>
>>>>> http://msdn.microsoft.com/en-us/library/ee658248.aspx search on the
>>>>> page for 'static event' should find the best ways to do this.
>>>>>
>>>>> Typically the child will unsubscribe itself inside Dispose()****
>>>>>
>>>>>
>>>>> On 2 Apr 2012, at 02:21, Stephen Price wrote:
>>>>>
>>>>> > Hey all,
>>>>> >
>>>>> > I've got a Static class that's behaving like an EventHandler in that
>>>>> you assign values to it via an operator + or - method.
>>>>> >
>>>>> > I need a method on this thing or some way that I can unhook the ones
>>>>> from one particular class (called from the dispose of that class) so that
>>>>> it can remove only the ones that were added from that class. Its accepting
>>>>> an Enum, so is there a way to see the owner of an Enum or where it was
>>>>> created?
>>>>> >
>>>>> > Or do I need to store something along with the Enum that can later
>>>>> be used to identify who attached it?
>>>>> >
>>>>> > If you imagine it as a Static eventhandler, how can I look through
>>>>> the references and only unhook the ones from a particular class. (assuming
>>>>> internally you can loop through each handler.
>>>>> > The actual problem is that it's causing a memory leak if I don't
>>>>> unhook these things when that page/veiwmodel is disposed.
>>>>> >
>>>>> > hope the above makes some kind of sense to someone. :)
>>>>> >
>>>>> > cheers,
>>>>> > Stephen****
>>>>>
>>>>> ** **
>>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to