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

Commit 4e780c2

Browse files
committed
Add CancelletaionToken.RegisterWithoutCaptureExecutionContext
1 parent 015e4f4 commit 4e780c2

File tree

6 files changed

+54
-10
lines changed

6 files changed

+54
-10
lines changed

Assets/Plugins/UniRx/Scripts/Async/CancellationTokenExtensions.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,58 @@ public static (UniTask, CancellationTokenRegistration) ToUniTask(this Cancellati
1818
}
1919

2020
var promise = new UniTaskCompletionSource<AsyncUnit>();
21-
return (promise.Task, cts.Register(cancellationTokenCallback, promise, false));
21+
return (promise.Task, cts.RegisterWithoutCaptureExecutionContext(cancellationTokenCallback, promise));
2222
}
2323

2424
static void Callback(object state)
2525
{
2626
var promise = (UniTaskCompletionSource<AsyncUnit>)state;
2727
promise.TrySetResult(AsyncUnit.Default);
2828
}
29+
30+
public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action callback)
31+
{
32+
var restoreFlow = false;
33+
if (!ExecutionContext.IsFlowSuppressed())
34+
{
35+
ExecutionContext.SuppressFlow();
36+
restoreFlow = true;
37+
}
38+
39+
try
40+
{
41+
return cancellationToken.Register(callback, false);
42+
}
43+
finally
44+
{
45+
if (restoreFlow)
46+
{
47+
ExecutionContext.RestoreFlow();
48+
}
49+
}
50+
}
51+
52+
public static CancellationTokenRegistration RegisterWithoutCaptureExecutionContext(this CancellationToken cancellationToken, Action<object> callback, object state)
53+
{
54+
var restoreFlow = false;
55+
if (!ExecutionContext.IsFlowSuppressed())
56+
{
57+
ExecutionContext.SuppressFlow();
58+
restoreFlow = true;
59+
}
60+
61+
try
62+
{
63+
return cancellationToken.Register(callback, state, false);
64+
}
65+
finally
66+
{
67+
if (restoreFlow)
68+
{
69+
ExecutionContext.RestoreFlow();
70+
}
71+
}
72+
}
2973
}
3074
}
3175

Assets/Plugins/UniRx/Scripts/Async/Triggers/AsyncTriggerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ protected UniTask<T> GetOrAddPromise<T>(ref AsyncTriggerPromise<T> promise, ref
188188
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, new AwakeMonitor(this));
189189
}
190190

191-
var registrationToken = cancellationToken.Register(Callback, Tuple.Create((ICancellationTokenKeyDictionary)promises, (ICancelablePromise)cancellablePromise));
191+
var registrationToken = cancellationToken.RegisterWithoutCaptureExecutionContext(Callback, Tuple.Create((ICancellationTokenKeyDictionary)promises, (ICancelablePromise)cancellablePromise));
192192
if (registeredCancellations == null)
193193
{
194194
registeredCancellations = ArrayPool<CancellationTokenRegistration>.Shared.Rent(4);

Assets/Plugins/UniRx/Scripts/Async/UnityAsyncExtensions.uGUI.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellat
212212

213213
if (cancellationToken.CanBeCanceled)
214214
{
215-
registration = cancellationToken.Register(cancellationCallback, this, false);
215+
registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this);
216216
}
217217

218218
TaskTracker.TrackActiveTask(this, 3);
@@ -326,7 +326,7 @@ public AsyncUnityEventHandler(UnityEvent<T> unityEvent, CancellationToken cancel
326326

327327
if (cancellationToken.CanBeCanceled)
328328
{
329-
registration = cancellationToken.Register(cancellationCallback, this, false);
329+
registration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this);
330330
}
331331

332332
TaskTracker.TrackActiveTask(this, 3);

Assets/Plugins/UniRx/Scripts/Tasks/UniTaskObservableExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public ToUniTaskObserver(UniTaskCompletionSource<T> promise, SingleAssignmentDis
116116

117117
if (this.cancellationToken.CanBeCanceled)
118118
{
119-
this.registration = this.cancellationToken.Register(callback, this, false);
119+
this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this);
120120
}
121121
}
122122

@@ -186,7 +186,7 @@ public FirstValueToUniTaskObserver(UniTaskCompletionSource<T> promise, SingleAss
186186

187187
if (this.cancellationToken.CanBeCanceled)
188188
{
189-
this.registration = this.cancellationToken.Register(callback, this, false);
189+
this.registration = this.cancellationToken.RegisterWithoutCaptureExecutionContext(callback, this);
190190
}
191191
}
192192

Assets/Plugins/UniRx/Scripts/UnityEngineBridge/ReactiveCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public UniTask<T> WaitUntilExecuteAsync(CancellationToken cancellationToken)
189189

190190
newPromise = new ReactivePropertyReusablePromise<T>(cancellationToken);
191191
removablePromises.Add(cancellationToken, newPromise);
192-
cancellationToken.Register(Callback, Tuple.Create(this, newPromise), false);
192+
cancellationToken.RegisterWithoutCaptureExecutionContext(Callback, Tuple.Create(this, newPromise));
193193

194194
return newPromise.Task;
195195
}
@@ -417,7 +417,7 @@ public UniTask<T> WaitUntilExecuteAsync(CancellationToken cancellationToken)
417417

418418
newPromise = new ReactivePropertyReusablePromise<T>(cancellationToken);
419419
removablePromises.Add(cancellationToken, newPromise);
420-
cancellationToken.Register(Callback, Tuple.Create(this, newPromise), false);
420+
cancellationToken.RegisterWithoutCaptureExecutionContext(Callback, Tuple.Create(this, newPromise));
421421

422422
return newPromise.Task;
423423
}

Assets/Plugins/UniRx/Scripts/UnityEngineBridge/ReactiveProperty.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public UniTask<T> WaitUntilValueChangedAsync(CancellationToken cancellationToken
299299

300300
newPromise = new ReactivePropertyReusablePromise<T>(cancellationToken);
301301
removablePromises.Add(cancellationToken, newPromise);
302-
cancellationToken.Register(Callback, Tuple.Create(this, newPromise), false);
302+
cancellationToken.RegisterWithoutCaptureExecutionContext(Callback, Tuple.Create(this, newPromise));
303303

304304
return newPromise.Task;
305305
}
@@ -589,7 +589,7 @@ public UniTask<T> WaitUntilValueChangedAsync(CancellationToken cancellationToken
589589

590590
newPromise = new ReactivePropertyReusablePromise<T>(cancellationToken);
591591
removablePromises.Add(cancellationToken, newPromise);
592-
cancellationToken.Register(Callback, Tuple.Create(this, newPromise), false);
592+
cancellationToken.RegisterWithoutCaptureExecutionContext(Callback, Tuple.Create(this, newPromise));
593593

594594
return newPromise.Task;
595595
}

0 commit comments

Comments
 (0)