Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Weak Event (c#) #440

Open
constructor-igor opened this issue Sep 5, 2019 · 1 comment
Open

Weak Event (c#) #440

constructor-igor opened this issue Sep 5, 2019 · 1 comment
Assignees

Comments

@constructor-igor
Copy link
Owner

constructor-igor commented Sep 5, 2019

@constructor-igor constructor-igor self-assigned this Sep 5, 2019
constructor-igor added a commit that referenced this issue Sep 5, 2019
@constructor-igor
Copy link
Owner Author

Show of problem with event.
We can see, GC doesn't show release publisher, when somebody (global subscriber) subscribed to event.

using System;

namespace WeakEventsDemo
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("[Main] started");

            Console.WriteLine("[Main] DemoPublisher_NoEvent");
            DemoPublisher_NoEvent();
            Console.WriteLine("[Main] DemoPublisher_Event_LocalSubscriber");
            DemoPublisher_Event_LocalSubscriber();
            Console.WriteLine("[Main] DemoPublisher_Event_GlobalSubscriber");
            DemoPublisher_Event_GlobalSubscriber();

            Console.WriteLine("[Main] Demo finished, Let's call GC");
            GC.Collect();
            GC.WaitForPendingFinalizers();
            Console.WriteLine("[Main] finished");
        }

        private static void DemoPublisher_NoEvent()
        {
            Publisher publisher = new Publisher();
            publisher.Run();
        }
        private static void DemoPublisher_Event_LocalSubscriber()
        {
            Subscriber subscriber = new Subscriber("local");
            Publisher publisher = new Publisher();
            publisher.MyEvent += subscriber.EventProcessing;
            publisher.Run();
        }
        private static readonly Subscriber m_globalSubscriber = new Subscriber("global");
        private static void DemoPublisher_Event_GlobalSubscriber()
        {
            Publisher publisher = new Publisher();
            publisher.MyEvent += m_globalSubscriber.EventProcessing;
            publisher.Run();
        }
    }
}

console

[global, 46104728] Subscriber.ctor()
[Main] started
[Main] DemoPublisher_NoEvent
[12289376] Publisher.ctor()
[12289376] Publisher.Run() started
[12289376] Publisher.Run() finished
[Main] DemoPublisher_Event_LocalSubscriber
[local, 43495525] Subscriber.ctor()
[55915408] Publisher.ctor()
[55915408] Publisher.Run() started
[local, 43495525] [event] args=System.EventArgs
[local, 43495525] [event] args=System.EventArgs
[55915408] Publisher.Run() finished
[Main] DemoPublisher_Event_GlobalSubscriber
[33476626] Publisher.ctor()
[33476626] Publisher.Run() started
[global, 46104728] [event] args=System.EventArgs
[global, 46104728] [event] args=System.EventArgs
[33476626] Publisher.Run() finished
[Main] Demo finished, Let's call GC
[33476626] Publisher.finalizer()
[12289376] Publisher.finalizer()
[55915408] Publisher.finalizer()
[local, 43495525] Subscriber.finalizer()
[Main] finished
[global, 46104728] Subscriber.finalizer()

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant