Skip to content
This repository was archived by the owner on Feb 20, 2024. It is now read-only.

Commit 7d12aa6

Browse files
committed
Make sure that CancellationToken can unsubscribe
1 parent 3c22b33 commit 7d12aa6

2 files changed

Lines changed: 42 additions & 3 deletions

File tree

Assets/UniTaskPubSub/Runtime/AsyncMessageBus.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,33 @@ public static IDisposable Subscribe<T>(
4646
return UniTask.CompletedTask;
4747
});
4848
}
49+
50+
public static void Subscribe<T>(
51+
this IAsyncSubscriber subscriber,
52+
Func<T, CancellationToken, UniTask> action,
53+
CancellationToken unsubscribeToken)
54+
{
55+
var subscription = subscriber.Subscribe(action);
56+
unsubscribeToken.Register(x => ((IDisposable)x).Dispose(), subscription);
57+
}
58+
59+
public static void Subscribe<T>(
60+
this IAsyncSubscriber subscriber,
61+
Func<T, UniTask> action,
62+
CancellationToken unsubscribeToken)
63+
{
64+
var subscription = subscriber.Subscribe(action);
65+
unsubscribeToken.Register(x => ((IDisposable)x).Dispose(), subscription);
66+
}
67+
68+
public static void Subscribe<T>(
69+
this IAsyncSubscriber subscriber,
70+
Action<T> action,
71+
CancellationToken unsubscribeToken)
72+
{
73+
var subscription = subscriber.Subscribe(action);
74+
unsubscribeToken.Register(x => ((IDisposable)x).Dispose(), subscription);
75+
}
4976
}
5077

5178
public class AsyncMessageBus : IAsyncPublisher, IAsyncSubscriber, IDisposable

Assets/UniTaskPubSub/Tests/AsyncMessageBusTest.cs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,17 +138,29 @@ public IEnumerator DisposeAll() => UniTask.ToCoroutine(async () =>
138138
});
139139

140140
[UnityTest]
141-
public IEnumerator SubscribeWithSync() => UniTask.ToCoroutine(async () =>
141+
public IEnumerator CancelSubscription() => UniTask.ToCoroutine(async () =>
142142
{
143143
var messageBus = new AsyncMessageBus();
144+
var unsubscribeTokenSource1 = new CancellationTokenSource();
145+
var unsubscribeTokenSource2 = new CancellationTokenSource();
144146
var receives = 0;
145147

146-
messageBus.Subscribe<TestMessage>(msg =>
148+
messageBus.Subscribe<TestMessage>(async msg =>
147149
{
150+
await UniTask.Yield();
148151
receives += 1;
149-
});
152+
}, unsubscribeTokenSource1.Token);
153+
154+
messageBus.Subscribe<TestMessage>(async msg =>
155+
{
156+
await UniTask.Yield();
157+
receives += 1;
158+
}, unsubscribeTokenSource2.Token);
159+
160+
unsubscribeTokenSource1.Cancel();
150161

151162
await messageBus.PublishAsync(new TestMessage(100));
163+
152164
Assert.That(receives, Is.EqualTo(1));
153165
});
154166
}

0 commit comments

Comments
 (0)