@@ -390,6 +390,8 @@ void Test()
390390 GC . Collect ( ) ;
391391
392392 Assert . AreEqual ( ! isWeak , weakRecipient . IsAlive ) ;
393+
394+ GC . KeepAlive ( messenger ) ;
393395 }
394396
395397 [ TestCategory ( "Mvvm" ) ]
@@ -464,6 +466,54 @@ void Test()
464466 Assert . IsTrue ( messenger . IsRegistered < MessageA > ( recipient ) ) ;
465467 }
466468
469+ [ TestCategory ( "Mvvm" ) ]
470+ [ TestMethod ]
471+ public void Test_Messenger_AutoCleanup ( )
472+ {
473+ IMessenger messenger = new WeakReferenceMessenger ( ) ;
474+
475+ static int GetRecipientsMapCount ( IMessenger messenger )
476+ {
477+ object recipientsMap =
478+ typeof ( WeakReferenceMessenger )
479+ . GetField ( "recipientsMap" , BindingFlags . Instance | BindingFlags . NonPublic )
480+ . GetValue ( messenger ) ;
481+
482+ return ( int ) recipientsMap . GetType ( ) . GetProperty ( "Count" ) . GetValue ( recipientsMap ) ;
483+ }
484+
485+ WeakReference weakRecipient ;
486+
487+ void Test ( )
488+ {
489+ var recipient = new RecipientWithSomeMessages ( ) ;
490+ weakRecipient = new WeakReference ( recipient ) ;
491+
492+ messenger . Register < MessageA > ( recipient ) ;
493+
494+ Assert . IsTrue ( messenger . IsRegistered < MessageA > ( recipient ) ) ;
495+
496+ Assert . AreEqual ( GetRecipientsMapCount ( messenger ) , 1 ) ;
497+
498+ GC . KeepAlive ( recipient ) ;
499+ }
500+
501+ Test ( ) ;
502+
503+ GC . Collect ( ) ;
504+
505+ Assert . IsFalse ( weakRecipient . IsAlive ) ;
506+
507+ // Now that the recipient is collected, trigger another full GC collection
508+ // to let the automatic cleanup callback run and trim the messenger data
509+ GC . Collect ( ) ;
510+ GC . WaitForPendingFinalizers ( ) ;
511+
512+ Assert . AreEqual ( GetRecipientsMapCount ( messenger ) , 0 ) ;
513+
514+ GC . KeepAlive ( messenger ) ;
515+ }
516+
467517 [ TestCategory ( "Mvvm" ) ]
468518 [ TestMethod ]
469519 [ DataRow ( typeof ( StrongReferenceMessenger ) ) ]
0 commit comments