mirror of
https://github.com/Cysharp/UniTask.git
synced 2026-05-16 20:20:45 +00:00
Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2eb75df68 | ||
|
|
4a62d7eba6 | ||
|
|
40d2d2fe06 | ||
|
|
d5d2cb5937 | ||
|
|
854100c075 | ||
|
|
5837b26208 | ||
|
|
da0e654e7d | ||
|
|
a3e9932be7 | ||
|
|
e82353b4d9 | ||
|
|
944b61f28c | ||
|
|
457c574865 | ||
|
|
089a509663 | ||
|
|
3bebaef969 | ||
|
|
37e8b4500e | ||
|
|
8537ddf8a6 | ||
|
|
346b1e0a6b | ||
|
|
fc7b9660a5 | ||
|
|
21e5cc22c7 | ||
|
|
3f18b37e5f | ||
|
|
5d4a90e9bd | ||
|
|
2bf9f4f062 | ||
|
|
d69490cb49 | ||
|
|
4e460c11ca | ||
|
|
9313969314 | ||
|
|
a40f89a922 | ||
|
|
e0d8410b62 | ||
|
|
bef1bd8ad1 | ||
|
|
81b4fcfac1 | ||
|
|
f1e4a3c65d | ||
|
|
65622b01f6 | ||
|
|
87dd5f13fd | ||
|
|
79cd2c17ba | ||
|
|
85fb08552e | ||
|
|
7bd4b6faf7 | ||
|
|
0b1ae7e295 | ||
|
|
35a893ad9e | ||
|
|
4955ed18f1 | ||
|
|
fe462328ab | ||
|
|
5136d92efa | ||
|
|
227f7872cb | ||
|
|
725b2fdc35 | ||
|
|
75abc8059f | ||
|
|
f1193743c8 | ||
|
|
109730eacd | ||
|
|
1f736afe86 | ||
|
|
4d554a6718 | ||
|
|
69c0c362e9 | ||
|
|
3bb446556a | ||
|
|
ea950d8cec | ||
|
|
a65f4da7a2 | ||
|
|
0bdc933c20 | ||
|
|
0c0f79c6db | ||
|
|
32f9b9d4ac |
4
.github/workflows/build-debug.yml
vendored
4
.github/workflows/build-debug.yml
vendored
@@ -3,7 +3,7 @@ name: Build-Debug
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- "**"
|
- "master"
|
||||||
tags:
|
tags:
|
||||||
- "!*" # not a tag push
|
- "!*" # not a tag push
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v1
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.101
|
dotnet-version: 3.1.x
|
||||||
- run: dotnet test -c Debug ./src/UniTask.NetCoreTests/UniTask.NetCoreTests.csproj
|
- run: dotnet test -c Debug ./src/UniTask.NetCoreTests/UniTask.NetCoreTests.csproj
|
||||||
|
|
||||||
build-unity:
|
build-unity:
|
||||||
|
|||||||
64
.github/workflows/build-release.yml
vendored
64
.github/workflows/build-release.yml
vendored
@@ -16,9 +16,9 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v1
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.101
|
dotnet-version: 3.1.x
|
||||||
# set release tag(*.*.*) to env.GIT_TAG
|
# set release tag(*.*.*) to env.GIT_TAG
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
- run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# build and pack
|
# build and pack
|
||||||
- run: dotnet build -c Release -p:Version=${{ env.GIT_TAG }}
|
- run: dotnet build -c Release -p:Version=${{ env.GIT_TAG }}
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
build-unity:
|
build-unity:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
unity: ['2019.3.9f1']
|
unity: ["2019.3.9f1"]
|
||||||
include:
|
include:
|
||||||
- unity: 2019.3.9f1
|
- unity: 2019.3.9f1
|
||||||
license: UNITY_2019_3
|
license: UNITY_2019_3
|
||||||
@@ -51,14 +51,14 @@ jobs:
|
|||||||
- run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .Unity.ulf || exit 0
|
- run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -manualLicenseFile .Unity.ulf || exit 0
|
||||||
|
|
||||||
# set release tag(*.*.*) to env.GIT_TAG
|
# set release tag(*.*.*) to env.GIT_TAG
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
- run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# Execute scripts: Export Package
|
# Execute scripts: Export Package
|
||||||
- name: Export unitypackage
|
- name: Export unitypackage
|
||||||
run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
|
run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
|
||||||
working-directory: src/UniTask
|
working-directory: src/UniTask
|
||||||
|
|
||||||
# Store artifacts.
|
# Store artifacts.
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||||
@@ -72,34 +72,34 @@ jobs:
|
|||||||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
|
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
|
||||||
NUGET_XMLDOC_MODE: skip
|
NUGET_XMLDOC_MODE: skip
|
||||||
steps:
|
steps:
|
||||||
# setup dotnet for nuget push
|
# setup dotnet for nuget push
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v1
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.101
|
dotnet-version: 3.1.x
|
||||||
# set release tag(*.*.*) to env.GIT_TAG
|
# set release tag(*.*.*) to env.GIT_TAG
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
- run: echo "GIT_TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||||
|
|
||||||
# Create Releases
|
# Create Releases
|
||||||
- uses: actions/create-release@v1
|
- uses: actions/create-release@v1
|
||||||
id: create_release
|
id: create_release
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ github.ref }}
|
tag_name: ${{ github.ref }}
|
||||||
release_name: Ver.${{ github.ref }}
|
release_name: Ver.${{ github.ref }}
|
||||||
|
|
||||||
# Download(All) Artifacts to current directory
|
# Download(All) Artifacts to current directory
|
||||||
- uses: actions/download-artifact@v2-preview
|
- uses: actions/download-artifact@v2-preview
|
||||||
|
|
||||||
# Upload to NuGet
|
# Upload to NuGet
|
||||||
- run: dotnet nuget push "./nuget/*.nupkg" -s https://www.nuget.org/api/v2/package -k ${{ secrets.NUGET_KEY }}
|
- run: dotnet nuget push "./nuget/*.nupkg" -s https://www.nuget.org/api/v2/package -k ${{ secrets.NUGET_KEY }}
|
||||||
|
|
||||||
# Upload to Releases(unitypackage)
|
# Upload to Releases(unitypackage)
|
||||||
- uses: actions/upload-release-asset@v1
|
- uses: actions/upload-release-asset@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||||
asset_path: ./UniTask.${{ env.GIT_TAG }}.unitypackage/UniTask.${{ env.GIT_TAG }}.unitypackage
|
asset_path: ./UniTask.${{ env.GIT_TAG }}.unitypackage/UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||||
asset_name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
asset_name: UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||||
asset_content_type: application/octet-stream
|
asset_content_type: application/octet-stream
|
||||||
|
|||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -253,3 +253,5 @@ src/UniTask/UnityEngine.UI.Player.csproj
|
|||||||
src/UniTask/DOTween.Modules.Player.csproj
|
src/UniTask/DOTween.Modules.Player.csproj
|
||||||
|
|
||||||
src/UniTask/Assembly-CSharp.Player.csproj
|
src/UniTask/Assembly-CSharp.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.EditorCoroutines.Editor.csproj
|
||||||
|
|||||||
36
README.md
36
README.md
@@ -14,7 +14,8 @@ Provides an efficient allocation free async/await integration to Unity.
|
|||||||
* Highly compatible behaviour with Task/ValueTask/IValueTaskSource
|
* Highly compatible behaviour with Task/ValueTask/IValueTaskSource
|
||||||
|
|
||||||
Techinical details, see blog post: [UniTask v2 — Zero Allocation async/await for Unity, with Asynchronous LINQ
|
Techinical details, see blog post: [UniTask v2 — Zero Allocation async/await for Unity, with Asynchronous LINQ
|
||||||
](https://medium.com/@neuecc/unitask-v2-zero-allocation-async-await-for-unity-with-asynchronous-linq-1aa9c96aa7dd)
|
](https://medium.com/@neuecc/unitask-v2-zero-allocation-async-await-for-unity-with-asynchronous-linq-1aa9c96aa7dd)
|
||||||
|
Advanced tips, see blog post: [Extends UnityWebRequest via async decorator pattern — Advanced Techniques of UniTask](https://medium.com/@neuecc/extends-unitywebrequest-via-async-decorator-pattern-advanced-techniques-of-unitask-ceff9c5ee846)
|
||||||
|
|
||||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||||
@@ -32,6 +33,9 @@ Techinical details, see blog post: [UniTask v2 — Zero Allocation async/await f
|
|||||||
- [Awaitable Events](#awaitable-events)
|
- [Awaitable Events](#awaitable-events)
|
||||||
- [Channel](#channel)
|
- [Channel](#channel)
|
||||||
- [For Unit Testing](#for-unit-testing)
|
- [For Unit Testing](#for-unit-testing)
|
||||||
|
- [ThreadPool limitation](#threadpool-limitation)
|
||||||
|
- [IEnumerator.ToUniTask limitation](#ienumeratortounitask-limitation)
|
||||||
|
- [For UnityEditor](#for-unityeditor)
|
||||||
- [Compare with Standard Task API](#compare-with-standard-task-api)
|
- [Compare with Standard Task API](#compare-with-standard-task-api)
|
||||||
- [Pooling Configuration](#pooling-configuration)
|
- [Pooling Configuration](#pooling-configuration)
|
||||||
- [Allocation on Profiler](#allocation-on-profiler)
|
- [Allocation on Profiler](#allocation-on-profiler)
|
||||||
@@ -211,6 +215,8 @@ await task; // NG, throws Exception
|
|||||||
|
|
||||||
Store to the class field, you can use `UniTask.Lazy` that gurantee call multipletimes. `.Preserve()` allows for multiple calls (internally cached results). This is useful when multiple calls in a function scope.
|
Store to the class field, you can use `UniTask.Lazy` that gurantee call multipletimes. `.Preserve()` allows for multiple calls (internally cached results). This is useful when multiple calls in a function scope.
|
||||||
|
|
||||||
|
Also `UniTaskCompletionSource` can await multipletimes and await from many caller.
|
||||||
|
|
||||||
Cancellation and Exception handling
|
Cancellation and Exception handling
|
||||||
---
|
---
|
||||||
Some UniTask factory methods have `CancellationToken cancellationToken = default` parameter. Andalso some async operation for unity have `WithCancellation(CancellationToken)` and `ToUniTask(..., CancellationToken cancellation = default)` extension methods.
|
Some UniTask factory methods have `CancellationToken cancellationToken = default` parameter. Andalso some async operation for unity have `WithCancellation(CancellationToken)` and `ToUniTask(..., CancellationToken cancellation = default)` extension methods.
|
||||||
@@ -347,6 +353,8 @@ It indicates when to run, you can check [PlayerLoopList.md](https://gist.github.
|
|||||||
|
|
||||||
`PlayerLoopTiming.Update` is similar as `yield return null` in coroutine, but it is called before Update(Update and uGUI events(button.onClick, etc...) are called on `ScriptRunBehaviourUpdate`, yield return null is called on `ScriptRunDelayedDynamicFrameRate`). `PlayerLoopTiming.FixedUpdate` is similar as `WaitForFixedUpdate`, `PlayerLoopTiming.LastPostLateUpdate` is similar as `WaitForEndOfFrame` in coroutine.
|
`PlayerLoopTiming.Update` is similar as `yield return null` in coroutine, but it is called before Update(Update and uGUI events(button.onClick, etc...) are called on `ScriptRunBehaviourUpdate`, yield return null is called on `ScriptRunDelayedDynamicFrameRate`). `PlayerLoopTiming.FixedUpdate` is similar as `WaitForFixedUpdate`, `PlayerLoopTiming.LastPostLateUpdate` is similar as `WaitForEndOfFrame` in coroutine.
|
||||||
|
|
||||||
|
> `await UniTask.WaitForEndOfFrame()` is not equilavelnt to coroutine's `yield return new WaitForEndOfFrame()`. Coroutine's WaitForEndOfFrame seems to run after the PlayerLoop is done. Some methods that require coroutine's end of frame(`ScreenCapture.CaptureScreenshotAsTexture`, `CommandBuffer`, etc) does not work correctly when replace to async/await. In that case, use a coroutine.
|
||||||
|
|
||||||
`yield return null` and `UniTask.Yield` is similar but different. `yield return null` always return next frame but `UniTask.Yield` return next called, that is, call `UniTask.Yield(PlayerLoopTiming.Update)` on `PreUpdate`, it returns same frame. `UniTask.NextFrame()` gurantees return next frame, this would be expected to behave exactly the same as `yield return null`.
|
`yield return null` and `UniTask.Yield` is similar but different. `yield return null` always return next frame but `UniTask.Yield` return next called, that is, call `UniTask.Yield(PlayerLoopTiming.Update)` on `PreUpdate`, it returns same frame. `UniTask.NextFrame()` gurantees return next frame, this would be expected to behave exactly the same as `yield return null`.
|
||||||
|
|
||||||
> UniTask.Yield(without CancellationToken) is a special type, returns `YieldAwaitable` and run on YieldRunner. It is most lightweight and faster.
|
> UniTask.Yield(without CancellationToken) is a special type, returns `YieldAwaitable` and run on YieldRunner. It is most lightweight and faster.
|
||||||
@@ -780,6 +788,28 @@ public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () =>
|
|||||||
|
|
||||||
UniTask itself's unit test is written by Unity Test Runner and [Cysharp/RuntimeUnitTestToolkit](https://github.com/Cysharp/RuntimeUnitTestToolkit) to check on CI and IL2CPP working.
|
UniTask itself's unit test is written by Unity Test Runner and [Cysharp/RuntimeUnitTestToolkit](https://github.com/Cysharp/RuntimeUnitTestToolkit) to check on CI and IL2CPP working.
|
||||||
|
|
||||||
|
ThreadPool limitation
|
||||||
|
---
|
||||||
|
Most UniTask methods run in a single thread (PlayerLoop), but only `UniTask.Run` and `UniTask.SwitchToThreadPool` run on a thread pool. If you use a thread pool, it won't work with WebGL and so on.
|
||||||
|
|
||||||
|
`UniTask.Run` will be deprecated in the future (marked with an Obsolete) and only `RunOnThreadPool` will be used. Also, if you use `UniTask.Run`, consider whether you can use `UniTask.Create` or `UniTask.Void`.
|
||||||
|
|
||||||
|
IEnumerator.ToUniTask limitation
|
||||||
|
---
|
||||||
|
You can convert coroutine(IEnumerator) to UniTask(or await directly) but has some limitations.
|
||||||
|
|
||||||
|
* `WaitForEndOfFrame`/`WaitForFixedUpdate`/`Coroutine` is not supported.
|
||||||
|
* Consuming loop timing is not same as StartCoroutine, it is used specified PlayerLoopTiming, and default's `PlayerLoopTiming.Update` is run before MonoBehaviour's Update and StartCoroutine's loop.
|
||||||
|
|
||||||
|
If you want to convert fully compatible from coroutine to async, use `IEnumerator.ToUniTask(MonoBehaviour coroutineRunner)` overload. It executes StartCoroutine on an instance of the argument MonoBehaviour and waits for it to complete in UniTask.
|
||||||
|
|
||||||
|
For UnityEditor
|
||||||
|
---
|
||||||
|
UniTask can run on Unity Edtitor like Editor Coroutine. However, there are some limitations.
|
||||||
|
|
||||||
|
* Delay, DelayFrame is not work correctly because can not get deltaTime in editor. Return the result of the await immediately; you can use `DelayType.Realtime` to wait for the right time.
|
||||||
|
* All PlayerLoopTiming run on timing, `EditorApplication.update`.
|
||||||
|
|
||||||
Compare with Standard Task API
|
Compare with Standard Task API
|
||||||
---
|
---
|
||||||
UniTask has many standard Task-like APIs. This table shows what is the alternative apis.
|
UniTask has many standard Task-like APIs. This table shows what is the alternative apis.
|
||||||
@@ -828,7 +858,7 @@ Use UniTask type.
|
|||||||
|
|
||||||
Pooling Configuration
|
Pooling Configuration
|
||||||
---
|
---
|
||||||
UniTask is aggressively caching async promise object to achive zero allocation. In default, cache all promises but you can configure `TaskPool.SetMaxPoolSize` to your value, the value indicates cache size per type. `TaskPool.GetCacheSizeInfo` returns current cached object in pool.
|
UniTask is aggressively caching async promise object to achive zero allocation(technical details, see blog post [UniTask v2 — Zero Allocation async/await for Unity, with Asynchronous LINQ](https://medium.com/@neuecc/unitask-v2-zero-allocation-async-await-for-unity-with-asynchronous-linq-1aa9c96aa7dd)). In default, cache all promises but you can configure `TaskPool.SetMaxPoolSize` to your value, the value indicates cache size per type. `TaskPool.GetCacheSizeInfo` returns current cached object in pool.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
foreach (var (type, size) in TaskPool.GetCacheSizeInfo())
|
foreach (var (type, size) in TaskPool.GetCacheSizeInfo())
|
||||||
@@ -882,7 +912,7 @@ After Unity 2019.3.4f1, Unity 2020.1a21, that support path query parameter of gi
|
|||||||
|
|
||||||
or add `"com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask"` to `Packages/manifest.json`.
|
or add `"com.cysharp.unitask": "https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask"` to `Packages/manifest.json`.
|
||||||
|
|
||||||
If you want to set a target version, UniTask is using `*.*.*` release tag so you can specify a version like `#2.0.31`. For example `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.0.31`.
|
If you want to set a target version, UniTask is using `*.*.*` release tag so you can specify a version like `#2.0.36`. For example `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.0.36`.
|
||||||
|
|
||||||
### Install via OpenUPM
|
### Install via OpenUPM
|
||||||
|
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class ThreadPoolWorkItem : IThreadPoolWorkItem, ITaskPoolNode<ThreadPoolWorkItem>
|
sealed class ThreadPoolWorkItem : IThreadPoolWorkItem, ITaskPoolNode<ThreadPoolWorkItem>
|
||||||
{
|
{
|
||||||
static TaskPool<ThreadPoolWorkItem> pool;
|
static TaskPool<ThreadPoolWorkItem> pool;
|
||||||
public ThreadPoolWorkItem NextNode { get; set; }
|
ThreadPoolWorkItem nextNode;
|
||||||
|
public ref ThreadPoolWorkItem NextNode => ref nextNode;
|
||||||
|
|
||||||
static ThreadPoolWorkItem()
|
static ThreadPoolWorkItem()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,11 +10,14 @@ public class QueueCheck
|
|||||||
{
|
{
|
||||||
Node node1 = new Node();
|
Node node1 = new Node();
|
||||||
Node node2 = new Node();
|
Node node2 = new Node();
|
||||||
|
RefNode refNode1 = new RefNode();
|
||||||
|
RefNode refNode2 = new RefNode();
|
||||||
Queue<Node> q1 = new Queue<Node>();
|
Queue<Node> q1 = new Queue<Node>();
|
||||||
Stack<Node> s1 = new Stack<Node>();
|
Stack<Node> s1 = new Stack<Node>();
|
||||||
ConcurrentQueue<Node> cq = new ConcurrentQueue<Node>();
|
ConcurrentQueue<Node> cq = new ConcurrentQueue<Node>();
|
||||||
ConcurrentStack<Node> cs = new ConcurrentStack<Node>();
|
ConcurrentStack<Node> cs = new ConcurrentStack<Node>();
|
||||||
static TaskPool<Node> pool;
|
static TaskPool<Node> pool;
|
||||||
|
static TaskPoolRefNode<RefNode> poolRefNode;
|
||||||
static TaskPoolEqualNull<Node> poolEqualNull;
|
static TaskPoolEqualNull<Node> poolEqualNull;
|
||||||
static TaskPoolClass<Node> poolClass = new TaskPoolClass<Node>();
|
static TaskPoolClass<Node> poolClass = new TaskPoolClass<Node>();
|
||||||
static TaskPoolWithoutSize<Node> poolWithoutSize;
|
static TaskPoolWithoutSize<Node> poolWithoutSize;
|
||||||
@@ -82,6 +85,14 @@ public class QueueCheck
|
|||||||
pool.TryPop(out _);
|
pool.TryPop(out _);
|
||||||
pool.TryPop(out _);
|
pool.TryPop(out _);
|
||||||
}
|
}
|
||||||
|
[Benchmark]
|
||||||
|
public void TaskPoolRefNode()
|
||||||
|
{
|
||||||
|
poolRefNode.TryPush(refNode1);
|
||||||
|
poolRefNode.TryPush(refNode2);
|
||||||
|
poolRefNode.TryPop(out _);
|
||||||
|
poolRefNode.TryPop(out _);
|
||||||
|
}
|
||||||
|
|
||||||
[Benchmark]
|
[Benchmark]
|
||||||
public void TaskPoolEqualNull()
|
public void TaskPoolEqualNull()
|
||||||
@@ -130,6 +141,18 @@ public interface ITaskPoolNode<T>
|
|||||||
T NextNode { get; set; }
|
T NextNode { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public sealed class RefNode :ITaskPoolRefNode<RefNode>
|
||||||
|
{
|
||||||
|
RefNode nextNode;
|
||||||
|
public ref RefNode NextNode => ref nextNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ITaskPoolRefNode<T>
|
||||||
|
{
|
||||||
|
ref T NextNode { get; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// mutable struct, don't mark readonly.
|
// mutable struct, don't mark readonly.
|
||||||
[StructLayout(LayoutKind.Auto)]
|
[StructLayout(LayoutKind.Auto)]
|
||||||
public struct TaskPoolWithoutLock<T>
|
public struct TaskPoolWithoutLock<T>
|
||||||
@@ -237,6 +260,60 @@ public struct TaskPool<T>
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
[StructLayout(LayoutKind.Auto)]
|
||||||
|
public struct TaskPoolRefNode<T>
|
||||||
|
where T : class, ITaskPoolRefNode<T>
|
||||||
|
{
|
||||||
|
int gate;
|
||||||
|
int size;
|
||||||
|
T root;
|
||||||
|
|
||||||
|
public int Size => size;
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
public bool TryPop(out T result)
|
||||||
|
{
|
||||||
|
if (Interlocked.CompareExchange(ref gate, 1, 0) == 0)
|
||||||
|
{
|
||||||
|
var v = root;
|
||||||
|
if (!(v is null))
|
||||||
|
{
|
||||||
|
ref var nextNode = ref v.NextNode;
|
||||||
|
root = nextNode;
|
||||||
|
nextNode = null;
|
||||||
|
size--;
|
||||||
|
result = v;
|
||||||
|
Volatile.Write(ref gate, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Volatile.Write(ref gate, 0);
|
||||||
|
}
|
||||||
|
result = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
public bool TryPush(T item)
|
||||||
|
{
|
||||||
|
if (Interlocked.CompareExchange(ref gate, 1, 0) == 0)
|
||||||
|
{
|
||||||
|
//if (size < TaskPool.MaxPoolSize)
|
||||||
|
{
|
||||||
|
item.NextNode = root;
|
||||||
|
root = item;
|
||||||
|
size++;
|
||||||
|
Volatile.Write(ref gate, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//else
|
||||||
|
{
|
||||||
|
// Volatile.Write(ref gate, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Auto)]
|
[StructLayout(LayoutKind.Auto)]
|
||||||
public struct TaskPoolEqualNull<T>
|
public struct TaskPoolEqualNull<T>
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
static Action<object> cancellationCallback = CancellationCallback;
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
static TaskPool<WaitAsyncSource> pool;
|
static TaskPool<WaitAsyncSource> pool;
|
||||||
WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode { get; set; }
|
WaitAsyncSource nextNode;
|
||||||
|
ref WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitAsyncSource()
|
static WaitAsyncSource()
|
||||||
{
|
{
|
||||||
@@ -404,7 +405,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
static Action<object> cancellationCallback = CancellationCallback;
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
static TaskPool<WaitAsyncSource> pool;
|
static TaskPool<WaitAsyncSource> pool;
|
||||||
WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode { get; set; }
|
WaitAsyncSource nextNode;
|
||||||
|
ref WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitAsyncSource()
|
static WaitAsyncSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
TaskPool.RegisterSizeGetter(typeof(AsyncUniTaskVoid<TStateMachine>), () => pool.Size);
|
TaskPool.RegisterSizeGetter(typeof(AsyncUniTaskVoid<TStateMachine>), () => pool.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AsyncUniTaskVoid<TStateMachine> NextNode { get; set; }
|
AsyncUniTaskVoid<TStateMachine> nextNode;
|
||||||
|
public ref AsyncUniTaskVoid<TStateMachine> NextNode => ref nextNode;
|
||||||
|
|
||||||
public void Return()
|
public void Return()
|
||||||
{
|
{
|
||||||
@@ -157,7 +158,8 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
||||||
}
|
}
|
||||||
|
|
||||||
public AsyncUniTask<TStateMachine> NextNode { get; set; }
|
AsyncUniTask<TStateMachine> nextNode;
|
||||||
|
public ref AsyncUniTask<TStateMachine> NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncUniTask()
|
static AsyncUniTask()
|
||||||
{
|
{
|
||||||
@@ -279,7 +281,8 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
||||||
}
|
}
|
||||||
|
|
||||||
public AsyncUniTask<TStateMachine, T> NextNode { get; set; }
|
AsyncUniTask<TStateMachine, T> nextNode;
|
||||||
|
public ref AsyncUniTask<TStateMachine, T> NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncUniTask()
|
static AsyncUniTask()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,10 +32,24 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return new UniTask(EnumeratorPromise.Create(enumerator, timing, cancellationToken, out var token), token);
|
return new UniTask(EnumeratorPromise.Create(enumerator, timing, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UniTask ToUniTask(this IEnumerator enumerator, MonoBehaviour coroutineRunner)
|
||||||
|
{
|
||||||
|
var source = AutoResetUniTaskCompletionSource.Create();
|
||||||
|
coroutineRunner.StartCoroutine(Core(enumerator, coroutineRunner, source));
|
||||||
|
return source.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IEnumerator Core(IEnumerator inner, MonoBehaviour coroutineRunner, AutoResetUniTaskCompletionSource source)
|
||||||
|
{
|
||||||
|
yield return coroutineRunner.StartCoroutine(inner);
|
||||||
|
source.TrySetResult();
|
||||||
|
}
|
||||||
|
|
||||||
sealed class EnumeratorPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<EnumeratorPromise>
|
sealed class EnumeratorPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<EnumeratorPromise>
|
||||||
{
|
{
|
||||||
static TaskPool<EnumeratorPromise> pool;
|
static TaskPool<EnumeratorPromise> pool;
|
||||||
public EnumeratorPromise NextNode { get; set; }
|
EnumeratorPromise nextNode;
|
||||||
|
public ref EnumeratorPromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static EnumeratorPromise()
|
static EnumeratorPromise()
|
||||||
{
|
{
|
||||||
@@ -45,6 +59,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
IEnumerator innerEnumerator;
|
IEnumerator innerEnumerator;
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
int initialFrame;
|
int initialFrame;
|
||||||
|
bool loopRunning;
|
||||||
|
bool calledGetResult;
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<object> core;
|
UniTaskCompletionSourceCore<object> core;
|
||||||
|
|
||||||
@@ -67,6 +83,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
result.innerEnumerator = ConsumeEnumerator(innerEnumerator);
|
result.innerEnumerator = ConsumeEnumerator(innerEnumerator);
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
result.loopRunning = true;
|
||||||
|
result.calledGetResult = false;
|
||||||
result.initialFrame = -1;
|
result.initialFrame = -1;
|
||||||
|
|
||||||
PlayerLoopHelper.AddAction(timing, result);
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
@@ -81,11 +99,15 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
calledGetResult = true;
|
||||||
core.GetResult(token);
|
core.GetResult(token);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
TryReturn();
|
if (!loopRunning)
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,8 +128,21 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
|
if (calledGetResult)
|
||||||
|
{
|
||||||
|
loopRunning = false;
|
||||||
|
TryReturn();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (innerEnumerator == null) // invalid status, returned but loop running?
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
|
loopRunning = false;
|
||||||
core.TrySetCanceled(cancellationToken);
|
core.TrySetCanceled(cancellationToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -134,10 +169,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
loopRunning = false;
|
||||||
core.TrySetException(ex);
|
core.TrySetException(ex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loopRunning = false;
|
||||||
core.TrySetResult(null);
|
core.TrySetResult(null);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -162,11 +199,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
else if (current is CustomYieldInstruction)
|
else if (current is CustomYieldInstruction cyi)
|
||||||
{
|
{
|
||||||
// WWW, WaitForSecondsRealtime
|
// WWW, WaitForSecondsRealtime
|
||||||
var e2 = UnwrapWaitCustomYieldInstruction((CustomYieldInstruction)current);
|
while (cyi.keepWaiting)
|
||||||
while (e2.MoveNext())
|
|
||||||
{
|
{
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
@@ -192,7 +228,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
yield return null;
|
goto WARN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (current is IEnumerator e3)
|
else if (current is IEnumerator e3)
|
||||||
@@ -205,17 +241,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// WaitForEndOfFrame, WaitForFixedUpdate, others.
|
goto WARN;
|
||||||
yield return null;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
continue;
|
||||||
|
|
||||||
// WWW and others as CustomYieldInstruction.
|
WARN:
|
||||||
static IEnumerator UnwrapWaitCustomYieldInstruction(CustomYieldInstruction yieldInstruction)
|
// WaitForEndOfFrame, WaitForFixedUpdate, others.
|
||||||
{
|
UnityEngine.Debug.LogWarning($"yield {current.GetType().Name} is not supported on await IEnumerator or IEnumerator.ToUniTask(), please use ToUniTask(MonoBehaviour coroutineRunner) instead.");
|
||||||
while (yieldInstruction.keepWaiting)
|
|
||||||
{
|
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,5 +280,4 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
public static class AddressablesAsyncExtensions
|
public static class AddressablesAsyncExtensions
|
||||||
{
|
{
|
||||||
#region AsyncOperationHandle
|
#region AsyncOperationHandle
|
||||||
|
|
||||||
public static UniTask.Awaiter GetAwaiter(this AsyncOperationHandle handle)
|
public static UniTask.Awaiter GetAwaiter(this AsyncOperationHandle handle)
|
||||||
{
|
{
|
||||||
@@ -31,7 +31,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
if (!handle.IsValid())
|
if (!handle.IsValid())
|
||||||
{
|
{
|
||||||
throw new Exception("Attempting to use an invalid operation handle");
|
// autoReleaseHandle:true handle is invalid(immediately internal handle == null) so return completed.
|
||||||
|
return UniTask.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handle.IsDone)
|
if (handle.IsDone)
|
||||||
@@ -94,7 +95,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource>
|
sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncOperationHandleConfiguredSource> pool;
|
static TaskPool<AsyncOperationHandleConfiguredSource> pool;
|
||||||
public AsyncOperationHandleConfiguredSource NextNode { get; set; }
|
AsyncOperationHandleConfiguredSource nextNode;
|
||||||
|
public ref AsyncOperationHandleConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncOperationHandleConfiguredSource()
|
static AsyncOperationHandleConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -221,9 +223,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region AsyncOperationHandle_T
|
#region AsyncOperationHandle_T
|
||||||
|
|
||||||
public static UniTask<T>.Awaiter GetAwaiter<T>(this AsyncOperationHandle<T> handle)
|
public static UniTask<T>.Awaiter GetAwaiter<T>(this AsyncOperationHandle<T> handle)
|
||||||
{
|
{
|
||||||
@@ -259,7 +261,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AsyncOperationHandleConfiguredSource<T> : IUniTaskSource<T>, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource<T>>
|
sealed class AsyncOperationHandleConfiguredSource<T> : IUniTaskSource<T>, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource<T>>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncOperationHandleConfiguredSource<T>> pool;
|
static TaskPool<AsyncOperationHandleConfiguredSource<T>> pool;
|
||||||
public AsyncOperationHandleConfiguredSource<T> NextNode { get; set; }
|
AsyncOperationHandleConfiguredSource<T> nextNode;
|
||||||
|
public ref AsyncOperationHandleConfiguredSource<T> NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncOperationHandleConfiguredSource()
|
static AsyncOperationHandleConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -391,7 +394,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -135,7 +135,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class TweenConfiguredSource : IUniTaskSource, ITaskPoolNode<TweenConfiguredSource>
|
sealed class TweenConfiguredSource : IUniTaskSource, ITaskPoolNode<TweenConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<TweenConfiguredSource> pool;
|
static TaskPool<TweenConfiguredSource> pool;
|
||||||
public TweenConfiguredSource NextNode { get; set; }
|
TweenConfiguredSource nextNode;
|
||||||
|
public ref TweenConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static TweenConfiguredSource()
|
static TweenConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -222,6 +223,17 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
void OnCompleteCallbackDelegate()
|
void OnCompleteCallbackDelegate()
|
||||||
{
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
if (this.cancelBehaviour == TweenCancelBehaviour.KillAndCancelAwait
|
||||||
|
|| this.cancelBehaviour == TweenCancelBehaviour.KillWithCompleteCallbackAndCancelAwait
|
||||||
|
|| this.cancelBehaviour == TweenCancelBehaviour.CompleteAndCancelAwait
|
||||||
|
|| this.cancelBehaviour == TweenCancelBehaviour.CompleteWithSeqeunceCallbackAndCancelAwait
|
||||||
|
|| this.cancelBehaviour == TweenCancelBehaviour.CancelAwait)
|
||||||
|
{
|
||||||
|
canceled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (canceled)
|
if (canceled)
|
||||||
{
|
{
|
||||||
core.TrySetCanceled(cancellationToken);
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
|
|
||||||
readonly PlayerLoopTiming timing;
|
readonly PlayerLoopTiming timing;
|
||||||
|
|
||||||
SpinLock gate = new SpinLock();
|
SpinLock gate = new SpinLock(false);
|
||||||
bool dequing = false;
|
bool dequing = false;
|
||||||
|
|
||||||
int actionListCount = 0;
|
int actionListCount = 0;
|
||||||
@@ -70,13 +70,17 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public int Clear()
|
||||||
{
|
{
|
||||||
|
var rest = actionListCount + waitingListCount;
|
||||||
|
|
||||||
actionListCount = 0;
|
actionListCount = 0;
|
||||||
actionList = new Action[InitialSize];
|
actionList = new Action[InitialSize];
|
||||||
|
|
||||||
waitingListCount = 0;
|
waitingListCount = 0;
|
||||||
waitingList = new Action[InitialSize];
|
waitingList = new Action[InitialSize];
|
||||||
|
|
||||||
|
return rest;
|
||||||
}
|
}
|
||||||
|
|
||||||
// delegate entrypoint.
|
// delegate entrypoint.
|
||||||
@@ -170,9 +174,9 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
|
|
||||||
for (int i = 0; i < actionListCount; i++)
|
for (int i = 0; i < actionListCount; i++)
|
||||||
{
|
{
|
||||||
|
|
||||||
var action = actionList[i];
|
var action = actionList[i];
|
||||||
actionList[i] = null;
|
actionList[i] = null;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
action();
|
action();
|
||||||
|
|||||||
@@ -48,14 +48,24 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public int Clear()
|
||||||
{
|
{
|
||||||
lock (arrayLock)
|
lock (arrayLock)
|
||||||
{
|
{
|
||||||
|
var rest = 0;
|
||||||
|
|
||||||
for (var index = 0; index < loopItems.Length; index++)
|
for (var index = 0; index < loopItems.Length; index++)
|
||||||
{
|
{
|
||||||
|
if (loopItems[index] != null)
|
||||||
|
{
|
||||||
|
rest++;
|
||||||
|
}
|
||||||
|
|
||||||
loopItems[index] = null;
|
loopItems[index] = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tail = 0;
|
||||||
|
return rest;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +153,6 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
{
|
{
|
||||||
var j = tail - 1;
|
var j = tail - 1;
|
||||||
|
|
||||||
// eliminate array-bound check for i
|
|
||||||
for (int i = 0; i < loopItems.Length; i++)
|
for (int i = 0; i < loopItems.Length; i++)
|
||||||
{
|
{
|
||||||
var action = loopItems[i];
|
var action = loopItems[i];
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
{
|
{
|
||||||
static TaskPool<PooledDelegate<T>> pool;
|
static TaskPool<PooledDelegate<T>> pool;
|
||||||
|
|
||||||
public PooledDelegate<T> NextNode { get; set; }
|
PooledDelegate<T> nextNode;
|
||||||
|
public ref PooledDelegate<T> NextNode => ref nextNode;
|
||||||
|
|
||||||
static PooledDelegate()
|
static PooledDelegate()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -110,27 +110,30 @@ namespace Cysharp.Threading.Tasks
|
|||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
EditorApplication.playModeStateChanged += (state) =>
|
EditorApplication.playModeStateChanged += (state) =>
|
||||||
{
|
{
|
||||||
if (state == PlayModeStateChange.EnteredEditMode || state == PlayModeStateChange.EnteredPlayMode)
|
if (state == PlayModeStateChange.EnteredEditMode || state == PlayModeStateChange.ExitingEditMode)
|
||||||
{
|
{
|
||||||
return;
|
// run rest action before clear.
|
||||||
}
|
if (runner != null)
|
||||||
|
{
|
||||||
|
runner.Run();
|
||||||
|
runner.Clear();
|
||||||
|
}
|
||||||
|
if (lastRunner != null)
|
||||||
|
{
|
||||||
|
lastRunner.Run();
|
||||||
|
lastRunner.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
if (runner != null)
|
if (cq != null)
|
||||||
{
|
{
|
||||||
runner.Clear();
|
cq.Run();
|
||||||
}
|
cq.Clear();
|
||||||
if (lastRunner != null)
|
}
|
||||||
{
|
if (lastCq != null)
|
||||||
lastRunner.Clear();
|
{
|
||||||
}
|
lastCq.Run();
|
||||||
|
lastCq.Clear();
|
||||||
if (cq != null)
|
}
|
||||||
{
|
|
||||||
cq.Clear();
|
|
||||||
}
|
|
||||||
if (lastCq != null)
|
|
||||||
{
|
|
||||||
lastCq.Clear();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@@ -288,7 +291,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
// Initialization
|
// Initialization
|
||||||
copyList[0].subSystemList = InsertRunner(copyList[0], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), yielders[0] = new ContinuationQueue(PlayerLoopTiming.Initialization),
|
copyList[0].subSystemList = InsertRunner(copyList[0], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), yielders[0] = new ContinuationQueue(PlayerLoopTiming.Initialization),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldInitialization), yielders[1] = new ContinuationQueue(PlayerLoopTiming.LastInitialization),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldInitialization), yielders[1] = new ContinuationQueue(PlayerLoopTiming.LastInitialization),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization), runners[1] = new PlayerLoopRunner(PlayerLoopTiming.Initialization),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization), runners[0] = new PlayerLoopRunner(PlayerLoopTiming.Initialization),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastInitialization), runners[1] = new PlayerLoopRunner(PlayerLoopTiming.LastInitialization));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastInitialization), runners[1] = new PlayerLoopRunner(PlayerLoopTiming.LastInitialization));
|
||||||
// EarlyUpdate
|
// EarlyUpdate
|
||||||
copyList[1].subSystemList = InsertRunner(copyList[1], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), yielders[2] = new ContinuationQueue(PlayerLoopTiming.EarlyUpdate),
|
copyList[1].subSystemList = InsertRunner(copyList[1], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), yielders[2] = new ContinuationQueue(PlayerLoopTiming.EarlyUpdate),
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static class TaskPool
|
public static class TaskPool
|
||||||
{
|
{
|
||||||
internal static int MaxPoolSize;
|
internal static int MaxPoolSize;
|
||||||
static ConcurrentDictionary<Type, Func<int>> sizes = new ConcurrentDictionary<Type, Func<int>>();
|
|
||||||
|
// avoid to use ConcurrentDictionary for safety of WebGL build.
|
||||||
|
static Dictionary<Type, Func<int>> sizes = new Dictionary<Type, Func<int>>();
|
||||||
|
|
||||||
static TaskPool()
|
static TaskPool()
|
||||||
{
|
{
|
||||||
@@ -40,22 +42,27 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public static IEnumerable<(Type, int)> GetCacheSizeInfo()
|
public static IEnumerable<(Type, int)> GetCacheSizeInfo()
|
||||||
{
|
{
|
||||||
foreach (var item in sizes)
|
lock (sizes)
|
||||||
{
|
{
|
||||||
yield return (item.Key, item.Value());
|
foreach (var item in sizes)
|
||||||
|
{
|
||||||
|
yield return (item.Key, item.Value());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegisterSizeGetter(Type type, Func<int> getSize)
|
public static void RegisterSizeGetter(Type type, Func<int> getSize)
|
||||||
{
|
{
|
||||||
sizes[type] = getSize;
|
lock (sizes)
|
||||||
|
{
|
||||||
|
sizes[type] = getSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface ITaskPoolNode<T>
|
public interface ITaskPoolNode<T>
|
||||||
{
|
{
|
||||||
T NextNode { get; set; }
|
ref T NextNode { get; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// mutable struct, don't mark readonly.
|
// mutable struct, don't mark readonly.
|
||||||
@@ -77,8 +84,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
var v = root;
|
var v = root;
|
||||||
if (!(v is null))
|
if (!(v is null))
|
||||||
{
|
{
|
||||||
root = v.NextNode;
|
ref var nextNode = ref v.NextNode;
|
||||||
v.NextNode = null;
|
root = nextNode;
|
||||||
|
nextNode = null;
|
||||||
size--;
|
size--;
|
||||||
result = v;
|
result = v;
|
||||||
Volatile.Write(ref gate, 0);
|
Volatile.Write(ref gate, 0);
|
||||||
|
|||||||
@@ -1541,6 +1541,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseDown
|
#region MouseDown
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseDownHandler
|
public interface IAsyncOnMouseDownHandler
|
||||||
{
|
{
|
||||||
@@ -1597,9 +1598,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseDownHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseDownAsync();
|
return ((IAsyncOnMouseDownHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseDownAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseDrag
|
#region MouseDrag
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseDragHandler
|
public interface IAsyncOnMouseDragHandler
|
||||||
{
|
{
|
||||||
@@ -1656,9 +1659,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseDragHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseDragAsync();
|
return ((IAsyncOnMouseDragHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseDragAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseEnter
|
#region MouseEnter
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseEnterHandler
|
public interface IAsyncOnMouseEnterHandler
|
||||||
{
|
{
|
||||||
@@ -1715,9 +1720,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseEnterHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseEnterAsync();
|
return ((IAsyncOnMouseEnterHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseEnterAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseExit
|
#region MouseExit
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseExitHandler
|
public interface IAsyncOnMouseExitHandler
|
||||||
{
|
{
|
||||||
@@ -1774,9 +1781,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseExitHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseExitAsync();
|
return ((IAsyncOnMouseExitHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseExitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseOver
|
#region MouseOver
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseOverHandler
|
public interface IAsyncOnMouseOverHandler
|
||||||
{
|
{
|
||||||
@@ -1833,9 +1842,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseOverHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseOverAsync();
|
return ((IAsyncOnMouseOverHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseOverAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseUp
|
#region MouseUp
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseUpHandler
|
public interface IAsyncOnMouseUpHandler
|
||||||
{
|
{
|
||||||
@@ -1892,9 +1903,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseUpHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseUpAsync();
|
return ((IAsyncOnMouseUpHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseUpAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseUpAsButton
|
#region MouseUpAsButton
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseUpAsButtonHandler
|
public interface IAsyncOnMouseUpAsButtonHandler
|
||||||
{
|
{
|
||||||
@@ -1951,6 +1964,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMouseUpAsButtonHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseUpAsButtonAsync();
|
return ((IAsyncOnMouseUpAsButtonHandler)new AsyncTriggerHandler<AsyncUnit>(this, cancellationToken, true)).OnMouseUpAsButtonAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ParticleCollision
|
#region ParticleCollision
|
||||||
|
|||||||
@@ -25,13 +25,7 @@
|
|||||||
("Update", "Update", "AsyncUnit", null, empty),
|
("Update", "Update", "AsyncUnit", null, empty),
|
||||||
("FixedUpdate", "FixedUpdate", "AsyncUnit", null, empty),
|
("FixedUpdate", "FixedUpdate", "AsyncUnit", null, empty),
|
||||||
("LateUpdate", "LateUpdate", "AsyncUnit", null, empty),
|
("LateUpdate", "LateUpdate", "AsyncUnit", null, empty),
|
||||||
("MouseDown", "OnMouseDown", "AsyncUnit", null, empty),
|
|
||||||
("MouseDrag", "OnMouseDrag", "AsyncUnit", null, empty),
|
|
||||||
("MouseEnter", "OnMouseEnter", "AsyncUnit", null, empty),
|
|
||||||
("MouseExit", "OnMouseExit", "AsyncUnit", null, empty),
|
|
||||||
("MouseOver", "OnMouseOver", "AsyncUnit", null, empty),
|
|
||||||
("MouseUp", "OnMouseUp", "AsyncUnit", null, empty),
|
|
||||||
("MouseUpAsButton", "OnMouseUpAsButton", "AsyncUnit", null, empty),
|
|
||||||
("ParticleCollision", "OnParticleCollision", "GameObject", null, new []{ ("GameObject", "other") }),
|
("ParticleCollision", "OnParticleCollision", "GameObject", null, new []{ ("GameObject", "other") }),
|
||||||
("RectTransformDimensionsChange", "OnRectTransformDimensionsChange", "AsyncUnit", null, empty),
|
("RectTransformDimensionsChange", "OnRectTransformDimensionsChange", "AsyncUnit", null, empty),
|
||||||
("RectTransformRemoved", "OnRectTransformRemoved", "AsyncUnit", null, empty),
|
("RectTransformRemoved", "OnRectTransformRemoved", "AsyncUnit", null, empty),
|
||||||
@@ -47,6 +41,15 @@
|
|||||||
("BecameInvisible", "OnBecameInvisible", "AsyncUnit", null, empty),
|
("BecameInvisible", "OnBecameInvisible", "AsyncUnit", null, empty),
|
||||||
("BecameVisible", "OnBecameVisible", "AsyncUnit", null, empty),
|
("BecameVisible", "OnBecameVisible", "AsyncUnit", null, empty),
|
||||||
|
|
||||||
|
// Mouse... #if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
("MouseDown", "OnMouseDown", "AsyncUnit", null, empty),
|
||||||
|
("MouseDrag", "OnMouseDrag", "AsyncUnit", null, empty),
|
||||||
|
("MouseEnter", "OnMouseEnter", "AsyncUnit", null, empty),
|
||||||
|
("MouseExit", "OnMouseExit", "AsyncUnit", null, empty),
|
||||||
|
("MouseOver", "OnMouseOver", "AsyncUnit", null, empty),
|
||||||
|
("MouseUp", "OnMouseUp", "AsyncUnit", null, empty),
|
||||||
|
("MouseUpAsButton", "OnMouseUpAsButton", "AsyncUnit", null, empty),
|
||||||
|
|
||||||
// new in v2
|
// new in v2
|
||||||
("ApplicationFocus", "OnApplicationFocus", "bool", null, new []{("bool", "hasFocus") }),
|
("ApplicationFocus", "OnApplicationFocus", "bool", null, new []{("bool", "hasFocus") }),
|
||||||
("ApplicationPause", "OnApplicationPause", "bool", null, new []{("bool", "pauseStatus") }),
|
("ApplicationPause", "OnApplicationPause", "bool", null, new []{("bool", "pauseStatus") }),
|
||||||
@@ -104,6 +107,7 @@
|
|||||||
Func<(string argType, string argName)[], string> BuildResultParameter = x => x.Length == 0 ? "AsyncUnit.Default" : "(" + string.Join(", ", x.Select(y => y.argName)) + ")";
|
Func<(string argType, string argName)[], string> BuildResultParameter = x => x.Length == 0 ? "AsyncUnit.Default" : "(" + string.Join(", ", x.Select(y => y.argName)) + ")";
|
||||||
|
|
||||||
Func<string, bool> Is2019_3 = x => x == "ParticleUpdateJobScheduled";
|
Func<string, bool> Is2019_3 = x => x == "ParticleUpdateJobScheduled";
|
||||||
|
Func<string, bool> IsMouseTrigger = x => x.StartsWith("Mouse");
|
||||||
#>
|
#>
|
||||||
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
||||||
|
|
||||||
@@ -117,6 +121,9 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#region <#= t.triggerName #>
|
#region <#= t.triggerName #>
|
||||||
<# if(Is2019_3(t.triggerName)) { #>
|
<# if(Is2019_3(t.triggerName)) { #>
|
||||||
#if UNITY_2019_3_OR_NEWER
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
<# } #>
|
||||||
|
<# if(IsMouseTrigger(t.triggerName)) { #>
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
<# } #>
|
<# } #>
|
||||||
|
|
||||||
public interface <#= ToInterfaceName(t.methodName) #>
|
public interface <#= ToInterfaceName(t.methodName) #>
|
||||||
@@ -174,7 +181,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((<#= ToInterfaceName(t.methodName) #>)new AsyncTriggerHandler<<#= t.returnType #>>(this, cancellationToken, true)).<#= t.methodName #>Async();
|
return ((<#= ToInterfaceName(t.methodName) #>)new AsyncTriggerHandler<<#= t.returnType #>>(this, cancellationToken, true)).<#= t.methodName #>Async();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
<# if(Is2019_3(t.triggerName)) { #>
|
<# if(Is2019_3(t.triggerName) || IsMouseTrigger(t.triggerName)) { #>
|
||||||
#endif
|
#endif
|
||||||
<# } #>
|
<# } #>
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -127,7 +127,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class YieldPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<YieldPromise>
|
sealed class YieldPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<YieldPromise>
|
||||||
{
|
{
|
||||||
static TaskPool<YieldPromise> pool;
|
static TaskPool<YieldPromise> pool;
|
||||||
public YieldPromise NextNode { get; set; }
|
YieldPromise nextNode;
|
||||||
|
public ref YieldPromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static YieldPromise()
|
static YieldPromise()
|
||||||
{
|
{
|
||||||
@@ -215,7 +216,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class NextFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<NextFramePromise>
|
sealed class NextFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<NextFramePromise>
|
||||||
{
|
{
|
||||||
static TaskPool<NextFramePromise> pool;
|
static TaskPool<NextFramePromise> pool;
|
||||||
public NextFramePromise NextNode { get; set; }
|
NextFramePromise nextNode;
|
||||||
|
public ref NextFramePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static NextFramePromise()
|
static NextFramePromise()
|
||||||
{
|
{
|
||||||
@@ -309,7 +311,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class DelayFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayFramePromise>
|
sealed class DelayFramePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayFramePromise>
|
||||||
{
|
{
|
||||||
static TaskPool<DelayFramePromise> pool;
|
static TaskPool<DelayFramePromise> pool;
|
||||||
public DelayFramePromise NextNode { get; set; }
|
DelayFramePromise nextNode;
|
||||||
|
public ref DelayFramePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static DelayFramePromise()
|
static DelayFramePromise()
|
||||||
{
|
{
|
||||||
@@ -424,7 +427,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class DelayPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayPromise>
|
sealed class DelayPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayPromise>
|
||||||
{
|
{
|
||||||
static TaskPool<DelayPromise> pool;
|
static TaskPool<DelayPromise> pool;
|
||||||
public DelayPromise NextNode { get; set; }
|
DelayPromise nextNode;
|
||||||
|
public ref DelayPromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static DelayPromise()
|
static DelayPromise()
|
||||||
{
|
{
|
||||||
@@ -534,7 +538,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class DelayIgnoreTimeScalePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayIgnoreTimeScalePromise>
|
sealed class DelayIgnoreTimeScalePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayIgnoreTimeScalePromise>
|
||||||
{
|
{
|
||||||
static TaskPool<DelayIgnoreTimeScalePromise> pool;
|
static TaskPool<DelayIgnoreTimeScalePromise> pool;
|
||||||
public DelayIgnoreTimeScalePromise NextNode { get; set; }
|
DelayIgnoreTimeScalePromise nextNode;
|
||||||
|
public ref DelayIgnoreTimeScalePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static DelayIgnoreTimeScalePromise()
|
static DelayIgnoreTimeScalePromise()
|
||||||
{
|
{
|
||||||
@@ -644,7 +649,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class DelayRealtimePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayRealtimePromise>
|
sealed class DelayRealtimePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayRealtimePromise>
|
||||||
{
|
{
|
||||||
static TaskPool<DelayRealtimePromise> pool;
|
static TaskPool<DelayRealtimePromise> pool;
|
||||||
public DelayRealtimePromise NextNode { get; set; }
|
DelayRealtimePromise nextNode;
|
||||||
|
public ref DelayRealtimePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static DelayRealtimePromise()
|
static DelayRealtimePromise()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -7,7 +7,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
public partial struct UniTask
|
public partial struct UniTask
|
||||||
{
|
{
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
#region OBSOLETE_RUN
|
||||||
|
|
||||||
|
// Run is a confusing name, use only RunOnThreadPool in the future.
|
||||||
|
|
||||||
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask Run(Action action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask Run(Action action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -35,7 +39,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask Run(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask Run(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -63,7 +67,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask Run(Func<UniTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask Run(Func<UniTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -91,7 +95,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask Run(Func<object, UniTask> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask Run(Func<object, UniTask> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -119,7 +123,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask<T> Run<T>(Func<T> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask<T> Run<T>(Func<T> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -146,7 +150,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask<T> Run<T>(Func<UniTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask<T> Run<T>(Func<UniTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -176,7 +180,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask<T> Run<T>(Func<object, T> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask<T> Run<T>(Func<object, T> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -203,7 +207,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
/// <summary>[Obsolete]recommend to use RunOnThreadPool(or UniTask.Void(async void), UniTask.Create(async UniTask)).</summary>
|
||||||
public static async UniTask<T> Run<T>(Func<object, UniTask<T>> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
public static async UniTask<T> Run<T>(Func<object, UniTask<T>> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -232,6 +236,235 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask RunOnThreadPool(Action action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
action();
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask RunOnThreadPool(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
action(state);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
action(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask RunOnThreadPool(Func<UniTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await action();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await action();
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask RunOnThreadPool(Func<object, UniTask> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await action(state);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await action(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask<T> RunOnThreadPool<T>(Func<T> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return func();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask<T> RunOnThreadPool<T>(Func<UniTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return await func();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = await func();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask<T> RunOnThreadPool<T>(Func<object, T> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return func(state);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return func(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>Run action on the threadPool and return to main thread if configureAwait = true.</summary>
|
||||||
|
public static async UniTask<T> RunOnThreadPool<T>(Func<object, UniTask<T>> func, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return await func(state);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = await func(state);
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -224,7 +224,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class ThreadPoolWorkItem : IThreadPoolWorkItem, ITaskPoolNode<ThreadPoolWorkItem>
|
sealed class ThreadPoolWorkItem : IThreadPoolWorkItem, ITaskPoolNode<ThreadPoolWorkItem>
|
||||||
{
|
{
|
||||||
static TaskPool<ThreadPoolWorkItem> pool;
|
static TaskPool<ThreadPoolWorkItem> pool;
|
||||||
public ThreadPoolWorkItem NextNode { get; set; }
|
ThreadPoolWorkItem nextNode;
|
||||||
|
public ref ThreadPoolWorkItem NextNode => ref nextNode;
|
||||||
|
|
||||||
static ThreadPoolWorkItem()
|
static ThreadPoolWorkItem()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,7 +38,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class WaitUntilPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilPromise>
|
sealed class WaitUntilPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilPromise>
|
||||||
{
|
{
|
||||||
static TaskPool<WaitUntilPromise> pool;
|
static TaskPool<WaitUntilPromise> pool;
|
||||||
public WaitUntilPromise NextNode { get; set; }
|
WaitUntilPromise nextNode;
|
||||||
|
public ref WaitUntilPromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitUntilPromise()
|
static WaitUntilPromise()
|
||||||
{
|
{
|
||||||
@@ -142,7 +143,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class WaitWhilePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitWhilePromise>
|
sealed class WaitWhilePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitWhilePromise>
|
||||||
{
|
{
|
||||||
static TaskPool<WaitWhilePromise> pool;
|
static TaskPool<WaitWhilePromise> pool;
|
||||||
public WaitWhilePromise NextNode { get; set; }
|
WaitWhilePromise nextNode;
|
||||||
|
public ref WaitWhilePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitWhilePromise()
|
static WaitWhilePromise()
|
||||||
{
|
{
|
||||||
@@ -246,7 +248,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class WaitUntilCanceledPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilCanceledPromise>
|
sealed class WaitUntilCanceledPromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<WaitUntilCanceledPromise>
|
||||||
{
|
{
|
||||||
static TaskPool<WaitUntilCanceledPromise> pool;
|
static TaskPool<WaitUntilCanceledPromise> pool;
|
||||||
public WaitUntilCanceledPromise NextNode { get; set; }
|
WaitUntilCanceledPromise nextNode;
|
||||||
|
public ref WaitUntilCanceledPromise NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitUntilCanceledPromise()
|
static WaitUntilCanceledPromise()
|
||||||
{
|
{
|
||||||
@@ -334,7 +337,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class WaitUntilValueChangedUnityObjectPromise<T, U> : IUniTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedUnityObjectPromise<T, U>>
|
sealed class WaitUntilValueChangedUnityObjectPromise<T, U> : IUniTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedUnityObjectPromise<T, U>>
|
||||||
{
|
{
|
||||||
static TaskPool<WaitUntilValueChangedUnityObjectPromise<T, U>> pool;
|
static TaskPool<WaitUntilValueChangedUnityObjectPromise<T, U>> pool;
|
||||||
public WaitUntilValueChangedUnityObjectPromise<T, U> NextNode { get; set; }
|
WaitUntilValueChangedUnityObjectPromise<T, U> nextNode;
|
||||||
|
public ref WaitUntilValueChangedUnityObjectPromise<T, U> NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitUntilValueChangedUnityObjectPromise()
|
static WaitUntilValueChangedUnityObjectPromise()
|
||||||
{
|
{
|
||||||
@@ -457,7 +461,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
where T : class
|
where T : class
|
||||||
{
|
{
|
||||||
static TaskPool<WaitUntilValueChangedStandardObjectPromise<T, U>> pool;
|
static TaskPool<WaitUntilValueChangedStandardObjectPromise<T, U>> pool;
|
||||||
public WaitUntilValueChangedStandardObjectPromise<T, U> NextNode { get; set; }
|
WaitUntilValueChangedStandardObjectPromise<T, U> nextNode;
|
||||||
|
public ref WaitUntilValueChangedStandardObjectPromise<T, U> NextNode => ref nextNode;
|
||||||
|
|
||||||
static WaitUntilValueChangedStandardObjectPromise()
|
static WaitUntilValueChangedStandardObjectPromise()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -319,7 +319,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public class AutoResetUniTaskCompletionSource : IUniTaskSource, ITaskPoolNode<AutoResetUniTaskCompletionSource>, IPromise
|
public class AutoResetUniTaskCompletionSource : IUniTaskSource, ITaskPoolNode<AutoResetUniTaskCompletionSource>, IPromise
|
||||||
{
|
{
|
||||||
static TaskPool<AutoResetUniTaskCompletionSource> pool;
|
static TaskPool<AutoResetUniTaskCompletionSource> pool;
|
||||||
public AutoResetUniTaskCompletionSource NextNode { get; set; }
|
AutoResetUniTaskCompletionSource nextNode;
|
||||||
|
public ref AutoResetUniTaskCompletionSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AutoResetUniTaskCompletionSource()
|
static AutoResetUniTaskCompletionSource()
|
||||||
{
|
{
|
||||||
@@ -441,7 +442,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public class AutoResetUniTaskCompletionSource<T> : IUniTaskSource<T>, ITaskPoolNode<AutoResetUniTaskCompletionSource<T>>, IPromise<T>
|
public class AutoResetUniTaskCompletionSource<T> : IUniTaskSource<T>, ITaskPoolNode<AutoResetUniTaskCompletionSource<T>>, IPromise<T>
|
||||||
{
|
{
|
||||||
static TaskPool<AutoResetUniTaskCompletionSource<T>> pool;
|
static TaskPool<AutoResetUniTaskCompletionSource<T>> pool;
|
||||||
public AutoResetUniTaskCompletionSource<T> NextNode { get; set; }
|
AutoResetUniTaskCompletionSource<T> nextNode;
|
||||||
|
public ref AutoResetUniTaskCompletionSource<T> NextNode => ref nextNode;
|
||||||
|
|
||||||
static AutoResetUniTaskCompletionSource()
|
static AutoResetUniTaskCompletionSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -561,21 +561,23 @@ namespace Cysharp.Threading.Tasks
|
|||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
awaiter.SourceOnCompleted(state =>
|
|
||||||
{
|
{
|
||||||
using (var t = (StateTuple<UniTask.Awaiter>)state)
|
awaiter.SourceOnCompleted(state =>
|
||||||
{
|
{
|
||||||
try
|
using (var t = (StateTuple<UniTask.Awaiter>)state)
|
||||||
{
|
{
|
||||||
t.Item1.GetResult();
|
try
|
||||||
|
{
|
||||||
|
t.Item1.GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
}, StateTuple.Create(awaiter));
|
||||||
{
|
}
|
||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, StateTuple.Create(awaiter));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Forget(this UniTask task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)
|
public static void Forget(this UniTask task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)
|
||||||
@@ -629,21 +631,23 @@ namespace Cysharp.Threading.Tasks
|
|||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
awaiter.SourceOnCompleted(state =>
|
|
||||||
{
|
{
|
||||||
using (var t = (StateTuple<UniTask<T>.Awaiter>)state)
|
awaiter.SourceOnCompleted(state =>
|
||||||
{
|
{
|
||||||
try
|
using (var t = (StateTuple<UniTask<T>.Awaiter>)state)
|
||||||
{
|
{
|
||||||
t.Item1.GetResult();
|
try
|
||||||
|
{
|
||||||
|
t.Item1.GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
}, StateTuple.Create(awaiter));
|
||||||
{
|
}
|
||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, StateTuple.Create(awaiter));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void Forget<T>(this UniTask<T> task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)
|
public static void Forget<T>(this UniTask<T> task, Action<Exception> exceptionHandler, bool handleExceptionOnMainThread = true)
|
||||||
@@ -732,11 +736,51 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return await await task;
|
return await await task;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async UniTask Unwrap<T>(this UniTask<UniTask> task)
|
public static async UniTask Unwrap(this UniTask<UniTask> task)
|
||||||
{
|
{
|
||||||
await await task;
|
await await task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async UniTask<T> Unwrap<T>(this Task<UniTask<T>> task)
|
||||||
|
{
|
||||||
|
return await await task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask<T> Unwrap<T>(this Task<UniTask<T>> task, bool continueOnCapturedContext)
|
||||||
|
{
|
||||||
|
return await await task.ConfigureAwait(continueOnCapturedContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask Unwrap(this Task<UniTask> task)
|
||||||
|
{
|
||||||
|
await await task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask Unwrap(this Task<UniTask> task, bool continueOnCapturedContext)
|
||||||
|
{
|
||||||
|
await await task.ConfigureAwait(continueOnCapturedContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask<T> Unwrap<T>(this UniTask<Task<T>> task)
|
||||||
|
{
|
||||||
|
return await await task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask<T> Unwrap<T>(this UniTask<Task<T>> task, bool continueOnCapturedContext)
|
||||||
|
{
|
||||||
|
return await (await task).ConfigureAwait(continueOnCapturedContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask Unwrap(this UniTask<Task> task)
|
||||||
|
{
|
||||||
|
await await task;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTask Unwrap(this UniTask<Task> task, bool continueOnCapturedContext)
|
||||||
|
{
|
||||||
|
await (await task).ConfigureAwait(continueOnCapturedContext);
|
||||||
|
}
|
||||||
|
|
||||||
#if UNITY_2018_3_OR_NEWER
|
#if UNITY_2018_3_OR_NEWER
|
||||||
|
|
||||||
sealed class ToCoroutineEnumerator : IEnumerator
|
sealed class ToCoroutineEnumerator : IEnumerator
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
const int MaxArrayLength = 0X7FEFFFFF;
|
const int MaxArrayLength = 0X7FEFFFFF;
|
||||||
const int InitialSize = 16;
|
const int InitialSize = 16;
|
||||||
|
|
||||||
static SpinLock gate = new SpinLock();
|
static SpinLock gate = new SpinLock(false);
|
||||||
static bool dequing = false;
|
static bool dequing = false;
|
||||||
|
|
||||||
static int actionListCount = 0;
|
static int actionListCount = 0;
|
||||||
|
|||||||
@@ -46,6 +46,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
this.continuationAction = null;
|
this.continuationAction = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AssetBundleRequestAllAssetsAwaiter GetAwaiter()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsCompleted => asyncOperation.isDone;
|
public bool IsCompleted => asyncOperation.isDone;
|
||||||
|
|
||||||
public UnityEngine.Object[] GetResult()
|
public UnityEngine.Object[] GetResult()
|
||||||
@@ -82,7 +87,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleRequestAllAssetsWithCancellationSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsWithCancellationSource>
|
sealed class AssetBundleRequestAllAssetsWithCancellationSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleRequestAllAssetsWithCancellationSource> pool;
|
static TaskPool<AssetBundleRequestAllAssetsWithCancellationSource> pool;
|
||||||
public AssetBundleRequestAllAssetsWithCancellationSource NextNode { get; set; }
|
AssetBundleRequestAllAssetsWithCancellationSource nextNode;
|
||||||
|
public ref AssetBundleRequestAllAssetsWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleRequestAllAssetsWithCancellationSource()
|
static AssetBundleRequestAllAssetsWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -204,7 +210,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleRequestAllAssetsConfiguredSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsConfiguredSource>
|
sealed class AssetBundleRequestAllAssetsConfiguredSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleRequestAllAssetsConfiguredSource> pool;
|
static TaskPool<AssetBundleRequestAllAssetsConfiguredSource> pool;
|
||||||
public AssetBundleRequestAllAssetsConfiguredSource NextNode { get; set; }
|
AssetBundleRequestAllAssetsConfiguredSource nextNode;
|
||||||
|
public ref AssetBundleRequestAllAssetsConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleRequestAllAssetsConfiguredSource()
|
static AssetBundleRequestAllAssetsConfiguredSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AsyncGPUReadbackRequestAwaiterConfiguredSource : IUniTaskSource<AsyncGPUReadbackRequest>, IPlayerLoopItem, ITaskPoolNode<AsyncGPUReadbackRequestAwaiterConfiguredSource>
|
sealed class AsyncGPUReadbackRequestAwaiterConfiguredSource : IUniTaskSource<AsyncGPUReadbackRequest>, IPlayerLoopItem, ITaskPoolNode<AsyncGPUReadbackRequestAwaiterConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncGPUReadbackRequestAwaiterConfiguredSource> pool;
|
static TaskPool<AsyncGPUReadbackRequestAwaiterConfiguredSource> pool;
|
||||||
public AsyncGPUReadbackRequestAwaiterConfiguredSource NextNode { get; set; }
|
AsyncGPUReadbackRequestAwaiterConfiguredSource nextNode;
|
||||||
|
public ref AsyncGPUReadbackRequestAwaiterConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncGPUReadbackRequestAwaiterConfiguredSource()
|
static AsyncGPUReadbackRequestAwaiterConfiguredSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -80,7 +80,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AsyncOperationWithCancellationSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationWithCancellationSource>
|
sealed class AsyncOperationWithCancellationSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncOperationWithCancellationSource> pool;
|
static TaskPool<AsyncOperationWithCancellationSource> pool;
|
||||||
public AsyncOperationWithCancellationSource NextNode { get; set; }
|
AsyncOperationWithCancellationSource nextNode;
|
||||||
|
public ref AsyncOperationWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncOperationWithCancellationSource()
|
static AsyncOperationWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -198,7 +199,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationConfiguredSource>
|
sealed class AsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncOperationConfiguredSource> pool;
|
static TaskPool<AsyncOperationConfiguredSource> pool;
|
||||||
public AsyncOperationConfiguredSource NextNode { get; set; }
|
AsyncOperationConfiguredSource nextNode;
|
||||||
|
public ref AsyncOperationConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncOperationConfiguredSource()
|
static AsyncOperationConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -374,7 +376,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class ResourceRequestWithCancellationSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<ResourceRequestWithCancellationSource>
|
sealed class ResourceRequestWithCancellationSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<ResourceRequestWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<ResourceRequestWithCancellationSource> pool;
|
static TaskPool<ResourceRequestWithCancellationSource> pool;
|
||||||
public ResourceRequestWithCancellationSource NextNode { get; set; }
|
ResourceRequestWithCancellationSource nextNode;
|
||||||
|
public ref ResourceRequestWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static ResourceRequestWithCancellationSource()
|
static ResourceRequestWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -496,7 +499,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class ResourceRequestConfiguredSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<ResourceRequestConfiguredSource>
|
sealed class ResourceRequestConfiguredSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<ResourceRequestConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<ResourceRequestConfiguredSource> pool;
|
static TaskPool<ResourceRequestConfiguredSource> pool;
|
||||||
public ResourceRequestConfiguredSource NextNode { get; set; }
|
ResourceRequestConfiguredSource nextNode;
|
||||||
|
public ref ResourceRequestConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static ResourceRequestConfiguredSource()
|
static ResourceRequestConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -677,7 +681,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleRequestWithCancellationSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestWithCancellationSource>
|
sealed class AssetBundleRequestWithCancellationSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleRequestWithCancellationSource> pool;
|
static TaskPool<AssetBundleRequestWithCancellationSource> pool;
|
||||||
public AssetBundleRequestWithCancellationSource NextNode { get; set; }
|
AssetBundleRequestWithCancellationSource nextNode;
|
||||||
|
public ref AssetBundleRequestWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleRequestWithCancellationSource()
|
static AssetBundleRequestWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -799,7 +804,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleRequestConfiguredSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestConfiguredSource>
|
sealed class AssetBundleRequestConfiguredSource : IUniTaskSource<UnityEngine.Object>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleRequestConfiguredSource> pool;
|
static TaskPool<AssetBundleRequestConfiguredSource> pool;
|
||||||
public AssetBundleRequestConfiguredSource NextNode { get; set; }
|
AssetBundleRequestConfiguredSource nextNode;
|
||||||
|
public ref AssetBundleRequestConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleRequestConfiguredSource()
|
static AssetBundleRequestConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -981,7 +987,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleCreateRequestWithCancellationSource : IUniTaskSource<AssetBundle>, IPlayerLoopItem, ITaskPoolNode<AssetBundleCreateRequestWithCancellationSource>
|
sealed class AssetBundleCreateRequestWithCancellationSource : IUniTaskSource<AssetBundle>, IPlayerLoopItem, ITaskPoolNode<AssetBundleCreateRequestWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleCreateRequestWithCancellationSource> pool;
|
static TaskPool<AssetBundleCreateRequestWithCancellationSource> pool;
|
||||||
public AssetBundleCreateRequestWithCancellationSource NextNode { get; set; }
|
AssetBundleCreateRequestWithCancellationSource nextNode;
|
||||||
|
public ref AssetBundleCreateRequestWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleCreateRequestWithCancellationSource()
|
static AssetBundleCreateRequestWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -1103,7 +1110,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class AssetBundleCreateRequestConfiguredSource : IUniTaskSource<AssetBundle>, IPlayerLoopItem, ITaskPoolNode<AssetBundleCreateRequestConfiguredSource>
|
sealed class AssetBundleCreateRequestConfiguredSource : IUniTaskSource<AssetBundle>, IPlayerLoopItem, ITaskPoolNode<AssetBundleCreateRequestConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AssetBundleCreateRequestConfiguredSource> pool;
|
static TaskPool<AssetBundleCreateRequestConfiguredSource> pool;
|
||||||
public AssetBundleCreateRequestConfiguredSource NextNode { get; set; }
|
AssetBundleCreateRequestConfiguredSource nextNode;
|
||||||
|
public ref AssetBundleCreateRequestConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AssetBundleCreateRequestConfiguredSource()
|
static AssetBundleCreateRequestConfiguredSource()
|
||||||
{
|
{
|
||||||
@@ -1307,7 +1315,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class UnityWebRequestAsyncOperationWithCancellationSource : IUniTaskSource<UnityWebRequest>, IPlayerLoopItem, ITaskPoolNode<UnityWebRequestAsyncOperationWithCancellationSource>
|
sealed class UnityWebRequestAsyncOperationWithCancellationSource : IUniTaskSource<UnityWebRequest>, IPlayerLoopItem, ITaskPoolNode<UnityWebRequestAsyncOperationWithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<UnityWebRequestAsyncOperationWithCancellationSource> pool;
|
static TaskPool<UnityWebRequestAsyncOperationWithCancellationSource> pool;
|
||||||
public UnityWebRequestAsyncOperationWithCancellationSource NextNode { get; set; }
|
UnityWebRequestAsyncOperationWithCancellationSource nextNode;
|
||||||
|
public ref UnityWebRequestAsyncOperationWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static UnityWebRequestAsyncOperationWithCancellationSource()
|
static UnityWebRequestAsyncOperationWithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -1438,7 +1447,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class UnityWebRequestAsyncOperationConfiguredSource : IUniTaskSource<UnityWebRequest>, IPlayerLoopItem, ITaskPoolNode<UnityWebRequestAsyncOperationConfiguredSource>
|
sealed class UnityWebRequestAsyncOperationConfiguredSource : IUniTaskSource<UnityWebRequest>, IPlayerLoopItem, ITaskPoolNode<UnityWebRequestAsyncOperationConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<UnityWebRequestAsyncOperationConfiguredSource> pool;
|
static TaskPool<UnityWebRequestAsyncOperationConfiguredSource> pool;
|
||||||
public UnityWebRequestAsyncOperationConfiguredSource NextNode { get; set; }
|
UnityWebRequestAsyncOperationConfiguredSource nextNode;
|
||||||
|
public ref UnityWebRequestAsyncOperationConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static UnityWebRequestAsyncOperationConfiguredSource()
|
static UnityWebRequestAsyncOperationConfiguredSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -154,7 +154,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class <#= t.typeName #>WithCancellationSource : <#= ToIUniTaskSourceReturnType(t.returnType) #>, IPlayerLoopItem, ITaskPoolNode<<#= t.typeName #>WithCancellationSource>
|
sealed class <#= t.typeName #>WithCancellationSource : <#= ToIUniTaskSourceReturnType(t.returnType) #>, IPlayerLoopItem, ITaskPoolNode<<#= t.typeName #>WithCancellationSource>
|
||||||
{
|
{
|
||||||
static TaskPool<<#= t.typeName #>WithCancellationSource> pool;
|
static TaskPool<<#= t.typeName #>WithCancellationSource> pool;
|
||||||
public <#= t.typeName #>WithCancellationSource NextNode { get; set; }
|
<#= t.typeName #>WithCancellationSource nextNode;
|
||||||
|
public ref <#= t.typeName #>WithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static <#= t.typeName #>WithCancellationSource()
|
static <#= t.typeName #>WithCancellationSource()
|
||||||
{
|
{
|
||||||
@@ -297,7 +298,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
sealed class <#= t.typeName #>ConfiguredSource : <#= ToIUniTaskSourceReturnType(t.returnType) #>, IPlayerLoopItem, ITaskPoolNode<<#= t.typeName #>ConfiguredSource>
|
sealed class <#= t.typeName #>ConfiguredSource : <#= ToIUniTaskSourceReturnType(t.returnType) #>, IPlayerLoopItem, ITaskPoolNode<<#= t.typeName #>ConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<<#= t.typeName #>ConfiguredSource> pool;
|
static TaskPool<<#= t.typeName #>ConfiguredSource> pool;
|
||||||
public <#= t.typeName #>ConfiguredSource NextNode { get; set; }
|
<#= t.typeName #>ConfiguredSource nextNode;
|
||||||
|
public ref <#= t.typeName #>ConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static <#= t.typeName #>ConfiguredSource()
|
static <#= t.typeName #>ConfiguredSource()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "com.cysharp.unitask",
|
"name": "com.cysharp.unitask",
|
||||||
"displayName": "UniTask",
|
"displayName": "UniTask",
|
||||||
"version": "2.0.31",
|
"version": "2.0.37",
|
||||||
"unity": "2018.4",
|
"unity": "2018.4",
|
||||||
"description": "Provides an efficient async/await integration to Unity.",
|
"description": "Provides an efficient async/await integration to Unity.",
|
||||||
"keywords": [ "async/await", "async", "Task", "UniTask" ],
|
"keywords": [ "async/await", "async", "Task", "UniTask" ],
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
// using UnityEngine.AddressableAssets;
|
||||||
|
|
||||||
/*UNniTastWhenAnyTester*/
|
/*UNniTastWhenAnyTester*/
|
||||||
|
|
||||||
@@ -49,4 +50,9 @@ public class ExceptionExamples : MonoBehaviour
|
|||||||
await UniTask.Delay(100);
|
await UniTask.Delay(100);
|
||||||
return taskIndex;
|
return taskIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void AddressablesTest()
|
||||||
|
//{
|
||||||
|
// Addressables.ClearDependencyCacheAsync("key", true);
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
@@ -493,8 +493,43 @@ public class SandboxMain : MonoBehaviour
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async UniTask QuitCheck()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await UniTask.Delay(TimeSpan.FromMinutes(1), cancellationToken: quitSource.Token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Debug.Log("End QuitCheck async");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CancellationTokenSource quitSource = new CancellationTokenSource();
|
||||||
|
|
||||||
|
|
||||||
|
IEnumerator TestCor()
|
||||||
|
{
|
||||||
|
Debug.Log("start cor");
|
||||||
|
yield return null;
|
||||||
|
yield return new WaitForEndOfFrame();
|
||||||
|
Debug.Log("end cor");
|
||||||
|
}
|
||||||
|
|
||||||
async UniTaskVoid Start()
|
async UniTaskVoid Start()
|
||||||
{
|
{
|
||||||
|
await TestCor().ToUniTask(this);
|
||||||
|
|
||||||
|
Debug.Log("App Start");
|
||||||
|
|
||||||
|
Application.quitting += () =>
|
||||||
|
{
|
||||||
|
Debug.Log("called quitting");
|
||||||
|
quitSource.Cancel();
|
||||||
|
};
|
||||||
|
|
||||||
|
QuitCheck().Forget();
|
||||||
|
|
||||||
//Expression.Lambda<Func<int>>(null).Compile(true);
|
//Expression.Lambda<Func<int>>(null).Compile(true);
|
||||||
|
|
||||||
//RunStandardTaskAsync();
|
//RunStandardTaskAsync();
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !UNITY_WEBGL
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator DelayAnd() => UniTask.ToCoroutine(async () =>
|
public IEnumerator DelayAnd() => UniTask.ToCoroutine(async () =>
|
||||||
{
|
{
|
||||||
@@ -76,6 +78,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () =>
|
public IEnumerator DelayIgnore() => UniTask.ToCoroutine(async () =>
|
||||||
{
|
{
|
||||||
@@ -183,6 +187,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
diff.Should().Be(11);
|
diff.Should().Be(11);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#if !UNITY_WEBGL
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator SwitchTo() => UniTask.ToCoroutine(async () =>
|
public IEnumerator SwitchTo() => UniTask.ToCoroutine(async () =>
|
||||||
{
|
{
|
||||||
@@ -215,6 +221,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
currentThreadId.Should().Be(switchedThreadId2);
|
currentThreadId.Should().Be(switchedThreadId2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
//[UnityTest]
|
//[UnityTest]
|
||||||
//public IEnumerator ObservableConversion() => UniTask.ToCoroutine(async () =>
|
//public IEnumerator ObservableConversion() => UniTask.ToCoroutine(async () =>
|
||||||
//{
|
//{
|
||||||
|
|||||||
@@ -96,6 +96,47 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
// l[1].Item2.Should().NotBe(currentFrame);
|
// l[1].Item2.Should().NotBe(currentFrame);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
|
[UnityTest]
|
||||||
|
public IEnumerator ImmediateRunTest() => UniTask.ToCoroutine(async () =>
|
||||||
|
{
|
||||||
|
var l = new List<int>();
|
||||||
|
var x1 = Immediate(l);
|
||||||
|
var x2 = Immediate(l);
|
||||||
|
var x3 = DelayOne(l);
|
||||||
|
|
||||||
|
var t1 = x1.ToUniTask();
|
||||||
|
CollectionAssert.AreEqual(l, new[] { 1, 2, 3 });
|
||||||
|
await t1;
|
||||||
|
|
||||||
|
var t2 = x2.ToUniTask();
|
||||||
|
CollectionAssert.AreEqual(l, new[] { 1, 2, 3, 1, 2, 3 });
|
||||||
|
|
||||||
|
var t3 = x3.ToUniTask();
|
||||||
|
CollectionAssert.AreEqual(l, new[] { 1, 2, 3, 1, 2, 3, 10 });
|
||||||
|
|
||||||
|
await UniTask.WhenAll(t2, t3);
|
||||||
|
CollectionAssert.AreEqual(l, new[] { 1, 2, 3, 1, 2, 3, 10, 20, 30 });
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
IEnumerator Immediate(List<int> l)
|
||||||
|
{
|
||||||
|
l.Add(1);
|
||||||
|
l.Add(2);
|
||||||
|
l.Add(3);
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
IEnumerator DelayOne(List<int> l)
|
||||||
|
{
|
||||||
|
l.Add(10);
|
||||||
|
yield return null;
|
||||||
|
l.Add(20);
|
||||||
|
l.Add(30);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !UNITY_WEBGL
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator WaitForSecondsTest() => UniTask.ToCoroutine(async () =>
|
public IEnumerator WaitForSecondsTest() => UniTask.ToCoroutine(async () =>
|
||||||
{
|
{
|
||||||
@@ -123,6 +164,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
yield return new WaitForSeconds(3.0f);
|
yield return new WaitForSeconds(3.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
IEnumerator Worker(List<(int, int)> l)
|
IEnumerator Worker(List<(int, int)> l)
|
||||||
{
|
{
|
||||||
l.Add((0, Time.frameCount));
|
l.Add((0, Time.frameCount));
|
||||||
|
|||||||
@@ -175,6 +175,7 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#if !UNITY_WEBGL
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator DelayInThreadPool() => UniTask.ToCoroutine(async () =>
|
public IEnumerator DelayInThreadPool() => UniTask.ToCoroutine(async () =>
|
||||||
@@ -185,6 +186,8 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
public IEnumerator DelayRealtime() => UniTask.ToCoroutine(async () =>
|
public IEnumerator DelayRealtime() => UniTask.ToCoroutine(async () =>
|
||||||
{
|
{
|
||||||
@@ -200,5 +203,16 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
okay1.Should().Be(true);
|
okay1.Should().Be(true);
|
||||||
okay2.Should().Be(true);
|
okay2.Should().Be(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
[UnityTest]
|
||||||
|
public IEnumerator LoopTest() => UniTask.ToCoroutine(async () =>
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 20; ++i)
|
||||||
|
{
|
||||||
|
UniTask.DelayFrame(100).Forget();
|
||||||
|
await UniTask.DelayFrame(1);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,6 +37,7 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
{
|
{
|
||||||
#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6))
|
#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6))
|
||||||
#if !UNITY_WSA
|
#if !UNITY_WSA
|
||||||
|
#if !UNITY_WEBGL
|
||||||
|
|
||||||
//[UnityTest]
|
//[UnityTest]
|
||||||
//public IEnumerator RunThread() => UniTask.ToCoroutine(async () =>
|
//public IEnumerator RunThread() => UniTask.ToCoroutine(async () =>
|
||||||
@@ -88,7 +89,7 @@ namespace Cysharp.Threading.TasksTests
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -543,7 +543,7 @@ PlayerSettings:
|
|||||||
platformArchitecture: {}
|
platformArchitecture: {}
|
||||||
scriptingBackend:
|
scriptingBackend:
|
||||||
Android: 1
|
Android: 1
|
||||||
Standalone: 0
|
Standalone: 1
|
||||||
il2cppCompilerConfiguration: {}
|
il2cppCompilerConfiguration: {}
|
||||||
managedStrippingLevel: {}
|
managedStrippingLevel: {}
|
||||||
incrementalIl2cppBuild: {}
|
incrementalIl2cppBuild: {}
|
||||||
|
|||||||
Reference in New Issue
Block a user