Skip to content

Commit 04977e1

Browse files
committed
Fix register/unregister issues of WeakReferenceMessenger
1 parent 6827aab commit 04977e1

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

Microsoft.Toolkit.Mvvm/Messaging/WeakReferenceMessenger.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,8 @@ public bool MoveNext()
406406

407407
while (node is not null)
408408
{
409+
LinkedListNode<WeakReference<TKey>>? nextNode = node.Next;
410+
409411
// Get the key and value for the current node
410412
if (node.Value.TryGetTarget(out TKey? target) &&
411413
this.owner.table.TryGetValue(target!, out TValue? value))
@@ -421,7 +423,7 @@ public bool MoveNext()
421423
this.owner.keys.Remove(node);
422424
}
423425

424-
node = node.Next;
426+
node = nextNode;
425427
}
426428

427429
return false;

UnitTests/UnitTests.Shared/Mvvm/Test_Messenger.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,29 @@ void Test()
511511
messenger.Cleanup();
512512
}
513513

514+
[TestCategory("Mvvm")]
515+
[TestMethod]
516+
[DataRow(typeof(StrongReferenceMessenger))]
517+
[DataRow(typeof(WeakReferenceMessenger))]
518+
public void Test_Messenger_RegisterMultiple_UnregisterSingle(Type type)
519+
{
520+
var messenger = (IMessenger)Activator.CreateInstance(type);
521+
522+
var recipient1 = new object();
523+
var recipient2 = new object();
524+
525+
int handlerCalledCount = 0;
526+
527+
messenger.Register<object, MessageA>(recipient1, (r, m) => { handlerCalledCount++; });
528+
messenger.Register<object, MessageA>(recipient2, (r, m) => { handlerCalledCount++; });
529+
530+
messenger.UnregisterAll(recipient2);
531+
532+
messenger.Send(new MessageA());
533+
534+
Assert.AreEqual(1, handlerCalledCount);
535+
}
536+
514537
public sealed class RecipientWithNoMessages
515538
{
516539
public int Number { get; set; }

0 commit comments

Comments
 (0)