diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs index b9cd1c9..5ec9da3 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.cs @@ -97,6 +97,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -123,6 +124,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -152,7 +154,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -209,6 +212,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -320,6 +324,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -346,6 +351,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -375,7 +381,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -436,6 +443,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -548,6 +556,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -574,6 +583,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -603,7 +613,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -664,6 +675,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -777,6 +789,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -803,6 +816,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -832,7 +846,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -893,6 +908,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } @@ -1021,6 +1037,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore core; @@ -1047,6 +1064,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -1077,7 +1095,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -1146,6 +1165,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); } diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt index 0516fef..ebcfa93 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UnityAsyncExtensions.tt @@ -165,6 +165,7 @@ namespace Cysharp.Threading.Tasks IProgress progress; CancellationToken cancellationToken; CancellationTokenRegistration cancellationTokenRegistration; + bool cancelImmediately; bool completed; UniTaskCompletionSourceCore<<#= IsVoid(t) ? "AsyncUnit" : t.returnType #>> core; @@ -191,6 +192,7 @@ namespace Cysharp.Threading.Tasks result.asyncOperation = asyncOperation; result.progress = progress; result.cancellationToken = cancellationToken; + result.cancelImmediately = cancelImmediately; result.completed = false; asyncOperation.completed += result.continuationAction; @@ -227,7 +229,8 @@ namespace Cysharp.Threading.Tasks } finally { - TryReturn(); + if (!(cancelImmediately && cancellationToken.IsCancellationRequested)) + TryReturn(); } } @@ -304,6 +307,7 @@ namespace Cysharp.Threading.Tasks progress = default; cancellationToken = default; cancellationTokenRegistration.Dispose(); + cancelImmediately = default; return pool.TryPush(this); }