@@ -114,7 +114,14 @@ public async Task DeadHandler_IsNotInvoked_AfterGarbageCollection()
114114 var weakEvent = new WeakEvent ( ) ;
115115 var callCount = 0 ;
116116
117- await CreateSubscriberAndInvoke ( weakEvent , ( ) => callCount ++ ) ;
117+ static async Task createSubscriberAndInvoke ( WeakEvent weakEvent , Action onEvent )
118+ {
119+ var subscriber = new NonGenericSubscriber ( onEvent ) ;
120+ weakEvent . Subscribe ( subscriber . Handler ) ;
121+ await weakEvent . PublishAsync ( ) ;
122+ // The subscriber goes out of scope after this method, allowing it to be GC’d.
123+ }
124+ await createSubscriberAndInvoke ( weakEvent , ( ) => callCount ++ ) ;
118125
119126 // Force garbage collection to reclaim the subscriber instance.
120127 GC . Collect ( ) ;
@@ -127,12 +134,36 @@ public async Task DeadHandler_IsNotInvoked_AfterGarbageCollection()
127134 Assert . Equal ( 1 , callCount ) ;
128135 }
129136
130- private static async Task CreateSubscriberAndInvoke ( WeakEvent weakEvent , Action onEvent )
137+ [ Fact ]
138+ public void MultipleHandlers_CorrectCount ( )
131139 {
132- var subscriber = new NonGenericSubscriber ( onEvent ) ;
133- weakEvent . Subscribe ( subscriber . Handler ) ;
134- await weakEvent . PublishAsync ( ) ;
135- // The subscriber goes out of scope after this method, allowing it to be GC’d.
140+ // Stage 1 - No subscribers yet
141+ var weakEvent = new WeakEvent ( ) ;
142+ Assert . Equal ( 0 , weakEvent . SubscriberCount ) ;
143+
144+ // Stage 2 - Add local handler
145+ void syncHandler ( )
146+ { }
147+ weakEvent . Subscribe ( syncHandler ) ;
148+ Assert . Equal ( 1 , weakEvent . SubscriberCount ) ;
149+
150+ // Stage 3 - Add a garbage-collected handler
151+ void createSubscriberAndAssert ( )
152+ {
153+ var subscriber = new NonGenericSubscriber ( ( ) => { } ) ;
154+ weakEvent . Subscribe ( subscriber . Handler ) ;
155+ Assert . Equal ( 2 , weakEvent . SubscriberCount ) ;
156+ }
157+ createSubscriberAndAssert ( ) ;
158+
159+ // Stage 4 - Force garbage collection to reclaim the garbage-collectable subscriber instance.
160+ GC . Collect ( ) ;
161+ GC . WaitForPendingFinalizers ( ) ;
162+ Assert . Equal ( 1 , weakEvent . SubscriberCount ) ;
163+
164+ // Stage 5 - Remove local handler
165+ weakEvent . Unsubscribe ( syncHandler ) ;
166+ Assert . Equal ( 0 , weakEvent . SubscriberCount ) ;
136167 }
137168
138169 private class NonGenericSubscriber ( Action onEvent )
0 commit comments