Browse Source

Merge pull request #2997 from MarchingCube/fix-weakevent-unsubscribe

Fix WeakEventHandlerManager unsubscribe
timer-overload
Steven Kirk 7 years ago
committed by GitHub
parent
commit
6e035c3d87
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs
  2. 20
      tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs

3
src/Avalonia.Base/Utilities/WeakEventHandlerManager.cs

@ -161,9 +161,8 @@ namespace Avalonia.Utilities
for (int c = 0; c < _count; ++c) for (int c = 0; c < _count; ++c)
{ {
var reference = _data[c].Subscriber; var reference = _data[c].Subscriber;
TSubscriber instance;
if (reference != null && reference.TryGetTarget(out instance) && instance == s) if (reference != null && reference.TryGetTarget(out TSubscriber instance) && Equals(instance, s.Target))
{ {
_data[c] = default; _data[c] = default;
removed = true; removed = true;

20
tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs

@ -36,7 +36,7 @@ namespace Avalonia.Base.UnitTests
} }
[Fact] [Fact]
public void EventShoudBePassedToSubscriber() public void EventShouldBePassedToSubscriber()
{ {
bool handled = false; bool handled = false;
var subscriber = new Subscriber(() => handled = true); var subscriber = new Subscriber(() => handled = true);
@ -47,7 +47,23 @@ namespace Avalonia.Base.UnitTests
Assert.True(handled); Assert.True(handled);
} }
[Fact]
public void EventShouldNotBeRaisedAfterUnsubscribe()
{
bool handled = false;
var subscriber = new Subscriber(() => handled = true);
var source = new EventSource();
WeakEventHandlerManager.Subscribe<EventSource, EventArgs, Subscriber>(source, "Event",
subscriber.OnEvent);
WeakEventHandlerManager.Unsubscribe<EventArgs, Subscriber>(source, "Event",
subscriber.OnEvent);
source.Fire();
Assert.False(handled);
}
[Fact] [Fact]
public void EventHandlerShouldNotBeKeptAlive() public void EventHandlerShouldNotBeKeptAlive()
{ {

Loading…
Cancel
Save