@@ -390,6 +390,8 @@ void Test()
390
390
GC . Collect ( ) ;
391
391
392
392
Assert . AreEqual ( ! isWeak , weakRecipient . IsAlive ) ;
393
+
394
+ GC . KeepAlive ( messenger ) ;
393
395
}
394
396
395
397
[ TestCategory ( "Mvvm" ) ]
@@ -464,6 +466,54 @@ void Test()
464
466
Assert . IsTrue ( messenger . IsRegistered < MessageA > ( recipient ) ) ;
465
467
}
466
468
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
+
467
517
[ TestCategory ( "Mvvm" ) ]
468
518
[ TestMethod ]
469
519
[ DataRow ( typeof ( StrongReferenceMessenger ) ) ]
0 commit comments