mirror of
https://github.com/Cysharp/UniTask.git
synced 2026-05-15 11:30:09 +00:00
Compare commits
215 Commits
fix-il2cpp
...
moreasmdef
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a35e5f929d | ||
|
|
9a3f10d4bf | ||
|
|
638522600a | ||
|
|
081113a62c | ||
|
|
6d382450cf | ||
|
|
19f2a6f282 | ||
|
|
7ed0b016ea | ||
|
|
f72a51e13d | ||
|
|
0e2dbbe754 | ||
|
|
cff51a0425 | ||
|
|
7cac4bbbab | ||
|
|
3f4a46bca6 | ||
|
|
7d21a75ea8 | ||
|
|
88817b7093 | ||
|
|
52cdadc035 | ||
|
|
5401b9b227 | ||
|
|
38de930f81 | ||
|
|
9be6ef7ba6 | ||
|
|
739bc6e26c | ||
|
|
71879266ac | ||
|
|
5ced0a1d4b | ||
|
|
908e361985 | ||
|
|
797affae4d | ||
|
|
ae3b825e29 | ||
|
|
143d97a73b | ||
|
|
90631c54b1 | ||
|
|
478e2998a8 | ||
|
|
9406305b2e | ||
|
|
1c26c81b20 | ||
|
|
a455de88b0 | ||
|
|
fba6942d5f | ||
|
|
3115efb672 | ||
|
|
fd70c031cb | ||
|
|
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 | ||
|
|
53907a3719 | ||
|
|
4937aeee3f | ||
|
|
5e5b8aff89 | ||
|
|
a2cbbd82d0 | ||
|
|
7eac5d8ba8 | ||
|
|
e2b1ed55ae | ||
|
|
727c7102d3 | ||
|
|
1494ea6717 | ||
|
|
f1ce64dbd3 | ||
|
|
3bad5cd2bf | ||
|
|
7432c0073a | ||
|
|
f1813a7c94 | ||
|
|
9e45c0a4d1 | ||
|
|
2c652cdde7 | ||
|
|
7718d345c8 | ||
|
|
9f39708325 | ||
|
|
bb6dbfa920 | ||
|
|
ba265005bb | ||
|
|
4d7cc7ed61 | ||
|
|
b64f31eb0b | ||
|
|
38d159b69e | ||
|
|
d5455f3716 | ||
|
|
a72ceeba11 | ||
|
|
c6b7d332b2 | ||
|
|
f37278f2a6 | ||
|
|
3f3e03b83d | ||
|
|
c99d3eb3c3 | ||
|
|
08d5183e7e | ||
|
|
51769b2224 | ||
|
|
6ec0ed8d61 | ||
|
|
2e35324403 | ||
|
|
e9474649c4 | ||
|
|
a8e0ce50c8 | ||
|
|
db7ddba735 | ||
|
|
1999d94b33 | ||
|
|
44af123b6c | ||
|
|
547b700ba7 | ||
|
|
6b87d5d2b0 | ||
|
|
023894d45e | ||
|
|
009715c0da | ||
|
|
c2824027d4 | ||
|
|
65b6553a1a | ||
|
|
9d3b7adc8e | ||
|
|
3724fc204c | ||
|
|
b97451a915 | ||
|
|
9ddcac4c6c | ||
|
|
b61e3c347f | ||
|
|
0bb44066c0 | ||
|
|
305c4aaa07 | ||
|
|
42d627f3ba | ||
|
|
6dd2b464a3 | ||
|
|
32f24cf8f8 | ||
|
|
4a89e3ea86 | ||
|
|
887db5b281 | ||
|
|
fee5518a82 | ||
|
|
551128e64c | ||
|
|
c65ae8d18e | ||
|
|
c1f75d9ebd | ||
|
|
73a5ff6648 | ||
|
|
1c264f380e | ||
|
|
f02bfa0a1e | ||
|
|
9d684006fc | ||
|
|
c49f1ed028 | ||
|
|
d935b226c0 | ||
|
|
d9e20de8a5 | ||
|
|
23997f0f93 | ||
|
|
529272d11b | ||
|
|
1194c38568 | ||
|
|
f0d2ee2beb | ||
|
|
68cdda086a | ||
|
|
54ceca6ceb | ||
|
|
50bdf7460c | ||
|
|
c06e45d0bb | ||
|
|
3ed6e28a00 | ||
|
|
ab76098895 | ||
|
|
0a447e43b0 | ||
|
|
8df44f2768 | ||
|
|
a7ec64d644 | ||
|
|
868e104d85 | ||
|
|
7ced7f5764 | ||
|
|
12b39c6ba1 | ||
|
|
93df9d7693 | ||
|
|
3980f314fa | ||
|
|
c2538da1cd | ||
|
|
5ed943bca2 | ||
|
|
d6a0563319 | ||
|
|
af82a94b87 | ||
|
|
82219e6111 | ||
|
|
81f9c55c7f | ||
|
|
0640f278cc | ||
|
|
769b5c6bab | ||
|
|
bdd569e213 | ||
|
|
5bfff5bc24 | ||
|
|
edf32496e4 | ||
|
|
785f5837d1 | ||
|
|
8c9272bc9f | ||
|
|
3e00735b3d | ||
|
|
00a1be8666 | ||
|
|
a2783d3c8a | ||
|
|
85d1a8a4a4 | ||
|
|
bbfb8354bb | ||
|
|
2f68e47443 | ||
|
|
89339ffb29 | ||
|
|
0535862fe6 | ||
|
|
a9e5fd4589 | ||
|
|
a3f3a28ea1 | ||
|
|
59020df965 | ||
|
|
ac01be79bf | ||
|
|
de5951f208 | ||
|
|
ded9a561db | ||
|
|
a2c18eb343 | ||
|
|
0b27c3a342 | ||
|
|
9c86cfb508 | ||
|
|
7e5e6ed6c2 | ||
|
|
d081e5f40b | ||
|
|
344ae0738c | ||
|
|
1b553f67b0 | ||
|
|
bf0adad427 | ||
|
|
11ca42a527 | ||
|
|
4898e4c7bf | ||
|
|
d494e0b9e3 | ||
|
|
be26ab249b | ||
|
|
611d8d5513 | ||
|
|
95c93b7c3d | ||
|
|
1dd0c49eec | ||
|
|
5d8e0e61ad | ||
|
|
478126e256 | ||
|
|
80704e489d | ||
|
|
3c0aa03643 |
35
.github/workflows/build-debug.yml
vendored
35
.github/workflows/build-debug.yml
vendored
@@ -3,16 +3,16 @@ name: Build-Debug
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- "**"
|
- "master"
|
||||||
tags:
|
tags:
|
||||||
- "!*" # not a tag push
|
- "!*" # not a tag push
|
||||||
pull_request:
|
pull_request:
|
||||||
types:
|
branches:
|
||||||
- opened
|
- "master"
|
||||||
- synchronize
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-dotnet:
|
build-dotnet:
|
||||||
|
if: "!(contains(github.event.head_commit.message, '[skip ci]') || contains(github.event.head_commit.message, '[ci skip]'))"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
@@ -22,13 +22,14 @@ 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:
|
||||||
|
if: "!(contains(github.event.head_commit.message, '[skip ci]') || contains(github.event.head_commit.message, '[ci skip]')) && ((github.event_name == 'push' && github.repository_owner == 'Cysharp') || startsWith(github.event.pull_request.head.label, 'Cysharp:'))"
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
unity: ['2019.3.9f1', '2020.1.0b5']
|
unity: ["2019.3.9f1", "2020.1.0b5"]
|
||||||
include:
|
include:
|
||||||
- unity: 2019.3.9f1
|
- unity: 2019.3.9f1
|
||||||
license: UNITY_2019_3
|
license: UNITY_2019_3
|
||||||
@@ -39,15 +40,11 @@ jobs:
|
|||||||
# with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags
|
# with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags
|
||||||
image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp
|
image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp
|
||||||
steps:
|
steps:
|
||||||
- run: apt update && apt install git -y
|
# Ubuntu 18.04 git is too old, use ppa latest git.
|
||||||
|
- run: |
|
||||||
|
apt-get update && apt-get install --no-install-recommends -y software-properties-common && add-apt-repository -y ppa:git-core/ppa
|
||||||
|
apt-get update && apt-get install --no-install-recommends -y git
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
# create unity activation file and store to artifacts.
|
|
||||||
- run: /opt/Unity/Editor/Unity -quit -batchmode -nographics -logFile -createManualActivationFile || exit 0
|
|
||||||
- uses: actions/upload-artifact@v1
|
|
||||||
with:
|
|
||||||
name: Unity_v${{ matrix.unity }}.alf
|
|
||||||
path: ./Unity_v${{ matrix.unity }}.alf
|
|
||||||
# activate Unity from manual license file(ulf)
|
|
||||||
- run: echo -n "$UNITY_LICENSE" >> .Unity.ulf
|
- run: echo -n "$UNITY_LICENSE" >> .Unity.ulf
|
||||||
env:
|
env:
|
||||||
UNITY_LICENSE: ${{ secrets[matrix.license] }}
|
UNITY_LICENSE: ${{ secrets[matrix.license] }}
|
||||||
@@ -66,6 +63,16 @@ jobs:
|
|||||||
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
|
||||||
|
|
||||||
|
- name: check all .meta is commited
|
||||||
|
run: |
|
||||||
|
if git ls-files --others --exclude-standard -t | grep --regexp='[.]meta$'; then
|
||||||
|
echo "Detected .meta file generated. Do you forgot commit a .meta file?"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Great, all .meta files are commited."
|
||||||
|
fi
|
||||||
|
working-directory: src/UniTask
|
||||||
|
|
||||||
# Store artifacts.
|
# Store artifacts.
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
138
.github/workflows/build-release.yml
vendored
138
.github/workflows/build-release.yml
vendored
@@ -1,63 +1,134 @@
|
|||||||
name: Build-Release
|
name: build-release
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_dispatch:
|
||||||
tags:
|
inputs:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+*"
|
tag:
|
||||||
|
description: "tag: git tag you want create. (sample 1.0.0)"
|
||||||
|
required: true
|
||||||
|
dry_run:
|
||||||
|
description: "dry_run: true will never create relase/nuget."
|
||||||
|
required: true
|
||||||
|
default: "false"
|
||||||
|
|
||||||
|
env:
|
||||||
|
GIT_TAG: ${{ github.event.inputs.tag }}
|
||||||
|
DRY_RUN: ${{ github.event.inputs.dry_run }}
|
||||||
|
DRY_RUN_BRANCH_PREFIX: "test_release"
|
||||||
|
DOTNET_SDK_VERISON_3: 3.1.x
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build-dotnet:
|
update-packagejson:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
TARGET_FILE: ./src/UniTask/Assets/Plugins/UniTask/package.json
|
||||||
|
outputs:
|
||||||
|
sha: ${{ steps.commit.outputs.sha }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: before
|
||||||
|
run: cat ${{ env.TARGET_FILE}}
|
||||||
|
- name: update package.json to version ${{ env.GIT_TAG }}
|
||||||
|
run: sed -i -e "s/\(\"version\":\) \"\(.*\)\",/\1 \"${{ env.GIT_TAG }}\",/" ${{ env.TARGET_FILE }}
|
||||||
|
- name: after
|
||||||
|
run: cat ${{ env.TARGET_FILE}}
|
||||||
|
- name: Commit files
|
||||||
|
id: commit
|
||||||
|
run: |
|
||||||
|
git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
||||||
|
git config --local user.name "github-actions[bot]"
|
||||||
|
git commit -m "feat: Update package.json to ${{ env.GIT_TAG }}" -a
|
||||||
|
echo "::set-output name=sha::$(git rev-parse HEAD)"
|
||||||
|
- name: check sha
|
||||||
|
run: echo "SHA ${SHA}"
|
||||||
|
env:
|
||||||
|
SHA: ${{ steps.commit.outputs.sha }}
|
||||||
|
- name: tag
|
||||||
|
run: git tag ${{ env.GIT_TAG }}
|
||||||
|
if: env.DRY_RUN == 'false'
|
||||||
|
- name: Push changes
|
||||||
|
uses: ad-m/github-push-action@master
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
branch: ${{ github.ref }}
|
||||||
|
tags: true
|
||||||
|
if: env.DRY_RUN == 'false'
|
||||||
|
- name: Push changes (dry_run)
|
||||||
|
uses: ad-m/github-push-action@master
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
branch: ${{ env.DRY_RUN_BRANCH_PREFIX }}-${{ env.GIT_TAG }}
|
||||||
|
tags: false
|
||||||
|
if: env.DRY_RUN == 'true'
|
||||||
|
|
||||||
|
build-dotnet:
|
||||||
|
needs: [update-packagejson]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
env:
|
env:
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
|
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
|
||||||
NUGET_XMLDOC_MODE: skip
|
NUGET_XMLDOC_MODE: skip
|
||||||
steps:
|
steps:
|
||||||
|
- run: echo ${{ needs.update-packagejson.outputs.sha }}
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||||
- uses: actions/setup-dotnet@v1
|
- uses: actions/setup-dotnet@v1
|
||||||
with:
|
with:
|
||||||
dotnet-version: 3.1.101
|
dotnet-version: "${{ env.DOTNET_SDK_VERSION_3 }}"
|
||||||
# set release tag(*.*.*) to env.GIT_TAG
|
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
|
||||||
|
|
||||||
# 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 }}
|
||||||
- run: dotnet test -c Release --no-build
|
- run: dotnet test -c Release --no-build
|
||||||
- run: dotnet pack ./src/UniTask.NetCore/UniTask.NetCore.csproj -c Release --no-build -p:Version=${{ env.GIT_TAG }}
|
- run: dotnet pack ./src/UniTask.NetCore/UniTask.NetCore.csproj -c Release --no-build -p:Version=${{ env.GIT_TAG }} -o ./publish
|
||||||
|
|
||||||
# Store artifacts.
|
# Store artifacts.
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: nuget
|
name: nuget
|
||||||
path: ./src/UniTask.NetCore/bin/Release/UniTask.${{ env.GIT_TAG }}.nupkg
|
path: ./publish/
|
||||||
|
|
||||||
build-unity:
|
build-unity:
|
||||||
|
needs: [update-packagejson]
|
||||||
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
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 15
|
||||||
container:
|
container:
|
||||||
# with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags
|
# with linux-il2cpp. image from https://hub.docker.com/r/gableroux/unity3d/tags
|
||||||
image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp
|
image: gableroux/unity3d:${{ matrix.unity }}-linux-il2cpp
|
||||||
steps:
|
steps:
|
||||||
- run: apt update && apt install git -y
|
# Ubuntu 18.04 git is too old, use ppa latest git.
|
||||||
|
- run: |
|
||||||
|
apt-get update && apt-get install --no-install-recommends -y software-properties-common && add-apt-repository -y ppa:git-core/ppa
|
||||||
|
apt-get update && apt-get install --no-install-recommends -y git
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ needs.update-packagejson.outputs.sha }}
|
||||||
|
# activate Unity from manual license file(ulf)
|
||||||
- run: echo -n "$UNITY_LICENSE" >> .Unity.ulf
|
- run: echo -n "$UNITY_LICENSE" >> .Unity.ulf
|
||||||
env:
|
env:
|
||||||
UNITY_LICENSE: ${{ secrets[matrix.license] }}
|
UNITY_LICENSE: ${{ secrets[matrix.license] }}
|
||||||
- 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
|
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
|
||||||
|
|
||||||
# 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
|
||||||
|
|
||||||
|
- name: check all .meta is commited
|
||||||
|
run: |
|
||||||
|
if git ls-files --others --exclude-standard -t | grep --regexp='[.]meta$'; then
|
||||||
|
echo "Detected .meta file generated. Do you forgot commit a .meta file?"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "Great, all .meta files are commited."
|
||||||
|
fi
|
||||||
|
working-directory: src/UniTask
|
||||||
|
|
||||||
# Store artifacts.
|
# Store artifacts.
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@@ -65,7 +136,8 @@ jobs:
|
|||||||
path: ./src/UniTask/UniTask.${{ env.GIT_TAG }}.unitypackage
|
path: ./src/UniTask/UniTask.${{ env.GIT_TAG }}.unitypackage
|
||||||
|
|
||||||
create-release:
|
create-release:
|
||||||
needs: [build-dotnet, build-unity]
|
if: github.event.inputs.dry_run == 'false'
|
||||||
|
needs: [update-packagejson, build-dotnet, build-unity]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
DOTNET_CLI_TELEMETRY_OPTOUT: 1
|
||||||
@@ -75,25 +147,22 @@ jobs:
|
|||||||
# 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: "${{ env.DOTNET_SDK_VERSION_3 }}"
|
||||||
# set release tag(*.*.*) to env.GIT_TAG
|
|
||||||
- run: echo ::set-env name=GIT_TAG::${GITHUB_REF#refs/tags/}
|
|
||||||
|
|
||||||
# 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: ${{ env.GIT_TAG }}
|
||||||
release_name: Ver.${{ github.ref }}
|
release_name: Ver.${{ env.GIT_TAG }}
|
||||||
|
commitish: ${{ needs.update-packagejson.outputs.sha }}
|
||||||
|
draft: true
|
||||||
|
prerelease: false
|
||||||
# Download(All) Artifacts to current directory
|
# Download(All) Artifacts to current directory
|
||||||
- uses: actions/download-artifact@v2-preview
|
- uses: actions/download-artifact@v2
|
||||||
|
|
||||||
# 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" --skip-duplicate -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:
|
||||||
@@ -103,3 +172,14 @@ jobs:
|
|||||||
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
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
if: github.event.inputs.dry_run == 'true'
|
||||||
|
needs: [build-dotnet, build-unity]
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Delete branch
|
||||||
|
uses: dawidd6/action-delete-branch@v3
|
||||||
|
with:
|
||||||
|
github_token: ${{ github.token }}
|
||||||
|
branches: ${{ env.DRY_RUN_BRANCH_PREFIX }}-${{ env.GIT_TAG }}
|
||||||
|
|||||||
24
.github/workflows/stale.yml
vendored
Normal file
24
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: "Close stale issues"
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v3
|
||||||
|
with:
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# enable issue
|
||||||
|
stale-issue-message: "This issue is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 7 days."
|
||||||
|
stale-issue-label: "stale"
|
||||||
|
# enable pr
|
||||||
|
stale-pr-message: "This PR is stale because it has been open 90 days with no activity. Remove stale label or comment or this will be closed in 7 days."
|
||||||
|
stale-pr-label: "stale"
|
||||||
|
days-before-stale: 90
|
||||||
|
days-before-close: 7
|
||||||
|
exempt-issue-labels: "wip"
|
||||||
|
exempt-pr-labels: "wip"
|
||||||
|
remove-stale-when-updated: true
|
||||||
54
.gitignore
vendored
54
.gitignore
vendored
@@ -205,3 +205,57 @@ src/UniTask/UnityEngine.Monetization.csproj
|
|||||||
src/UniTask/UnityEngine.TestRunner.csproj
|
src/UniTask/UnityEngine.TestRunner.csproj
|
||||||
|
|
||||||
src/UniTask/UnityEngine.UI.csproj
|
src/UniTask/UnityEngine.UI.csproj
|
||||||
|
|
||||||
|
src/UniTask/TempAsm.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.Addressables.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.DOTween.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.TextMeshPro.csproj
|
||||||
|
|
||||||
|
src/UniTask/RuntimeUnitTestToolkit.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/TempAsm.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.Addressables.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.DOTween.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.Linq.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.Tests.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UniTask.TextMeshPro.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.Addressables.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.Analytics.DataPrivacy.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.ResourceManager.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.ScriptableBuildPipeline.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.TextMeshPro.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.Timeline.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UnityEngine.Advertisements.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UnityEngine.Monetization.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UnityEngine.TestRunner.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/UnityEngine.UI.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/DOTween.Modules.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Assembly-CSharp.Player.csproj
|
||||||
|
|
||||||
|
src/UniTask/Unity.EditorCoroutines.Editor.csproj
|
||||||
|
|
||||||
|
src/UniTask/.vsconfig
|
||||||
|
|
||||||
|
src/UniTask/Logs/ApiUpdaterCheck.txt
|
||||||
|
|||||||
375
README.md
375
README.md
@@ -2,17 +2,21 @@ UniTask
|
|||||||
===
|
===
|
||||||
[](https://github.com/Cysharp/UniTask/actions) [](https://github.com/Cysharp/UniTask/releases)
|
[](https://github.com/Cysharp/UniTask/actions) [](https://github.com/Cysharp/UniTask/releases)
|
||||||
|
|
||||||
Provides an efficient async/await integration to Unity.
|
Provides an efficient allocation free async/await integration for Unity.
|
||||||
|
|
||||||
* Struct based `UniTask<T>` and custom AsyncMethodBuilder to achive zero allocation
|
* Struct based `UniTask<T>` and custom AsyncMethodBuilder to achieve zero allocation
|
||||||
* All Unity AsyncOperations and Coroutine to awaitable
|
* Makes all Unity AsyncOperations and Coroutines awaitable
|
||||||
* PlayerLoop based task(`UniTask.Yield`, `UniTask.Delay`, `UniTask.DelayFrame`, etc..) that enable to replace all coroutine operation
|
* PlayerLoop based task(`UniTask.Yield`, `UniTask.Delay`, `UniTask.DelayFrame`, etc..) that enable replacing all coroutine operations
|
||||||
* MonoBehaviour Message Events and uGUI Events as awaitable/async-enumerable
|
* MonoBehaviour Message Events and uGUI Events as awaitable/async-enumerable
|
||||||
* Completely run on Unity's PlayerLoop so don't use thread and run on WebGL, wasm, etc.
|
* Runs completely on Unity's PlayerLoop so doesn't use threads and runs on WebGL, wasm, etc.
|
||||||
* Asynchronous LINQ, with Channel and AsyncReactiveProperty
|
* Asynchronous LINQ, with Channel and AsyncReactiveProperty
|
||||||
* TaskTracker window to prevent memory leak
|
* TaskTracker window to prevent memory leaks
|
||||||
* Highly compatible behaviour with Task/ValueTask/IValueTaskSource
|
* Highly compatible behaviour with Task/ValueTask/IValueTaskSource
|
||||||
|
|
||||||
|
For 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)
|
||||||
|
For 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 -->
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
@@ -29,7 +33,13 @@ Provides an efficient async/await integration to Unity.
|
|||||||
- [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)
|
||||||
- [Pooling Configuration](#pooling-configuration)
|
- [Pooling Configuration](#pooling-configuration)
|
||||||
|
- [Allocation on Profiler](#allocation-on-profiler)
|
||||||
|
- [UniTaskSynchronizationContext](#unitasksynchronizationcontext)
|
||||||
- [API References](#api-references)
|
- [API References](#api-references)
|
||||||
- [UPM Package](#upm-package)
|
- [UPM Package](#upm-package)
|
||||||
- [Install via git URL](#install-via-git-url)
|
- [Install via git URL](#install-via-git-url)
|
||||||
@@ -62,7 +72,7 @@ async UniTask<string> DemoAsync()
|
|||||||
// .ToUniTask accepts progress callback(and all options), Progress.Create is a lightweight alternative of IProgress<T>
|
// .ToUniTask accepts progress callback(and all options), Progress.Create is a lightweight alternative of IProgress<T>
|
||||||
var asset3 = await Resources.LoadAsync<TextAsset>("baz").ToUniTask(Progress.Create<float>(x => Debug.Log(x)));
|
var asset3 = await Resources.LoadAsync<TextAsset>("baz").ToUniTask(Progress.Create<float>(x => Debug.Log(x)));
|
||||||
|
|
||||||
// await frame-based operation like coroutine
|
// await frame-based operation like a coroutine
|
||||||
await UniTask.DelayFrame(100);
|
await UniTask.DelayFrame(100);
|
||||||
|
|
||||||
// replacement of yield return new WaitForSeconds/WaitForSecondsRealtime
|
// replacement of yield return new WaitForSeconds/WaitForSecondsRealtime
|
||||||
@@ -87,10 +97,10 @@ async UniTask<string> DemoAsync()
|
|||||||
// special helper of WaitUntil
|
// special helper of WaitUntil
|
||||||
await UniTask.WaitUntilValueChanged(this, x => x.isActive);
|
await UniTask.WaitUntilValueChanged(this, x => x.isActive);
|
||||||
|
|
||||||
// You can await IEnumerator coroutine
|
// You can await IEnumerator coroutines
|
||||||
await FooCoroutineEnumerator();
|
await FooCoroutineEnumerator();
|
||||||
|
|
||||||
// You can await standard task
|
// You can await a standard task
|
||||||
await Task.Run(() => 100);
|
await Task.Run(() => 100);
|
||||||
|
|
||||||
// Multithreading, run on ThreadPool under this code
|
// Multithreading, run on ThreadPool under this code
|
||||||
@@ -112,13 +122,13 @@ async UniTask<string> DemoAsync()
|
|||||||
var task2 = GetTextAsync(UnityWebRequest.Get("http://bing.com"));
|
var task2 = GetTextAsync(UnityWebRequest.Get("http://bing.com"));
|
||||||
var task3 = GetTextAsync(UnityWebRequest.Get("http://yahoo.com"));
|
var task3 = GetTextAsync(UnityWebRequest.Get("http://yahoo.com"));
|
||||||
|
|
||||||
// concurrent async-wait and get result easily by tuple syntax
|
// concurrent async-wait and get results easily by tuple syntax
|
||||||
var (google, bing, yahoo) = await UniTask.WhenAll(task1, task2, task3);
|
var (google, bing, yahoo) = await UniTask.WhenAll(task1, task2, task3);
|
||||||
|
|
||||||
// shorthand of WhenAll, tuple can await directly
|
// shorthand of WhenAll, tuple can await directly
|
||||||
var (google2, bing2, yahoo2) = await (task1, task2, task3);
|
var (google2, bing2, yahoo2) = await (task1, task2, task3);
|
||||||
|
|
||||||
// You can handle timeout easily
|
// You can handle timeouts easily
|
||||||
await GetTextAsync(UnityWebRequest.Get("http://unity.com")).Timeout(TimeSpan.FromMilliseconds(300));
|
await GetTextAsync(UnityWebRequest.Get("http://unity.com")).Timeout(TimeSpan.FromMilliseconds(300));
|
||||||
|
|
||||||
// return async-value.(or you can use `UniTask`(no result), `UniTaskVoid`(fire and forget)).
|
// return async-value.(or you can use `UniTask`(no result), `UniTaskVoid`(fire and forget)).
|
||||||
@@ -128,11 +138,11 @@ async UniTask<string> DemoAsync()
|
|||||||
|
|
||||||
Basics of UniTask and AsyncOperation
|
Basics of UniTask and AsyncOperation
|
||||||
---
|
---
|
||||||
UniTask feature rely on C# 7.0([task-like custom async method builder feature](https://github.com/dotnet/roslyn/blob/master/docs/features/task-types.md)) so required Unity version is after `Unity 2018.3`, officialy lower support version is `Unity 2018.4.13f1`.
|
UniTask features rely on C# 7.0([task-like custom async method builder feature](https://github.com/dotnet/roslyn/blob/master/docs/features/task-types.md)) so the required Unity version is after `Unity 2018.3`, the official lowest version supported is `Unity 2018.4.13f1`.
|
||||||
|
|
||||||
Why UniTask(custom task-like object) is required? Because Task is too heavy, not matched to Unity threading(single-thread). UniTask does not use thread and SynchronizationContext/ExecutionContext because almost Unity's asynchronous object is automaticaly dispatched by Unity's engine layer. It acquires more fast and more less allocation, completely integrated with Unity.
|
Why is UniTask(custom task-like object) required? Because Task is too heavy and not matched to Unity threading (single-thread). UniTask does not use threads and SynchronizationContext/ExecutionContext because Unity's asynchronous object is automaticaly dispatched by Unity's engine layer. It achieves faster and lower allocation, and is completely integrated with Unity.
|
||||||
|
|
||||||
You can await `AsyncOperation`, `ResourceRequest`, `AssetBundleRequest`, `AssetBundleCreateRequest`, `UnityWebRequestAsyncOperation`, `IEnumerator` and others when `using Cysharp.Threading.Tasks;`.
|
You can await `AsyncOperation`, `ResourceRequest`, `AssetBundleRequest`, `AssetBundleCreateRequest`, `UnityWebRequestAsyncOperation`, `AsyncGPUReadbackRequest`, `IEnumerator` and others when `using Cysharp.Threading.Tasks;`.
|
||||||
|
|
||||||
UniTask provides three pattern of extension methods.
|
UniTask provides three pattern of extension methods.
|
||||||
|
|
||||||
@@ -142,33 +152,32 @@ UniTask provides three pattern of extension methods.
|
|||||||
* .ToUniTask(IProgress, PlayerLoopTiming, CancellationToken);
|
* .ToUniTask(IProgress, PlayerLoopTiming, CancellationToken);
|
||||||
```
|
```
|
||||||
|
|
||||||
`WithCancellation` is a simple version of `ToUniTask`, both returns `UniTask`. Details of cancellation, see: [Cancellation and Exception handling](#cancellation-and-exception-handling) section.
|
`WithCancellation` is a simple version of `ToUniTask`, both return `UniTask`. For details of cancellation, see: [Cancellation and Exception handling](#cancellation-and-exception-handling) section.
|
||||||
|
|
||||||
> Note: WithCancellation is returned from native timing of PlayerLoop but ToUniTask is returned from specified PlayerLoopTiming. Details of timing, see: [PlayerLoop](#playerloop) section.
|
> Note: WithCancellation is returned from native timing of PlayerLoop but ToUniTask is returned from specified PlayerLoopTiming. For details of timing, see: [PlayerLoop](#playerloop) section.
|
||||||
|
|
||||||
The type of `UniTask` can use utility like `UniTask.WhenAll`, `UniTask.WhenAny`. It is like Task.WhenAll/WhenAny but return type is more useful, returns value tuple so can deconsrtuct each result and pass multiple type.
|
> Note: AssetBundleRequest has `asset` and `allAssets`, default await returns `asset`. If you want to get `allAssets`, you can use `AwaitForAllAssets()` method.
|
||||||
|
|
||||||
|
The type of `UniTask` can use utilities like `UniTask.WhenAll`, `UniTask.WhenAny`. They are like `Task.WhenAll`/`Task.WhenAny` but the return type is more useful. They return value tuples so you can deconstruct each result and pass multiple types.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class SceneAssets
|
public async UniTaskVoid LoadManyAsync()
|
||||||
{
|
{
|
||||||
public SceneAssets()
|
|
||||||
{
|
|
||||||
// parallel load.
|
// parallel load.
|
||||||
var (a, b, c) = await UniTask.WhenAll(
|
var (a, b, c) = await UniTask.WhenAll(
|
||||||
LoadAsSprite("foo"),
|
LoadAsSprite("foo"),
|
||||||
LoadAsSprite("bar"),
|
LoadAsSprite("bar"),
|
||||||
LoadAsSprite("baz"));
|
LoadAsSprite("baz"));
|
||||||
}
|
}
|
||||||
|
|
||||||
async UniTask<Sprite> LoadAsSprite(string path)
|
async UniTask<Sprite> LoadAsSprite(string path)
|
||||||
{
|
{
|
||||||
var resource = await Resources.LoadAsync<Sprite>(path);
|
var resource = await Resources.LoadAsync<Sprite>(path);
|
||||||
return (resource as Sprite);
|
return (resource as Sprite);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to convert callback to UniTask, you can use `UniTaskCompletionSource<T>` that is the lightweight edition of `TaskCompletionSource<T>`.
|
If you want to convert a callback to UniTask, you can use `UniTaskCompletionSource<T>` which is a lightweight edition of `TaskCompletionSource<T>`.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public UniTask<int> WrapByUniTaskCompletionSource()
|
public UniTask<int> WrapByUniTaskCompletionSource()
|
||||||
@@ -185,7 +194,7 @@ public UniTask<int> WrapByUniTaskCompletionSource()
|
|||||||
|
|
||||||
You can convert Task -> UniTask: `AsUniTask`, `UniTask` -> `UniTask<AsyncUnit>`: `AsAsyncUnitUniTask`, `UniTask<T>` -> `UniTask`: `AsUniTask`. `UniTask<T>` -> `UniTask`'s conversion cost is free.
|
You can convert Task -> UniTask: `AsUniTask`, `UniTask` -> `UniTask<AsyncUnit>`: `AsAsyncUnitUniTask`, `UniTask<T>` -> `UniTask`: `AsUniTask`. `UniTask<T>` -> `UniTask`'s conversion cost is free.
|
||||||
|
|
||||||
If you want to convert async to coroutine, you can use `.ToCoroutine()`, this is useful to use only allow coroutine system.
|
If you want to convert async to coroutine, you can use `.ToCoroutine()`, this is useful if you want to only allow using the coroutine system.
|
||||||
|
|
||||||
UniTask can not await twice. This is a similar constraint to the [ValueTask/IValueTaskSource](https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask-1?view=netcore-3.1) introduced in .NET Standard 2.1.
|
UniTask can not await twice. This is a similar constraint to the [ValueTask/IValueTaskSource](https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.valuetask-1?view=netcore-3.1) introduced in .NET Standard 2.1.
|
||||||
|
|
||||||
@@ -204,11 +213,13 @@ await task;
|
|||||||
await task; // NG, throws Exception
|
await task; // NG, throws Exception
|
||||||
```
|
```
|
||||||
|
|
||||||
Store to the class field, you can use `UniTask.Lazy` that gurantee call multipletimes. `.Prevent()` 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 supports calling multiple times. `.Preserve()` allows for multiple calls (internally cached results). This is useful when there are multiple calls in a function scope.
|
||||||
|
|
||||||
|
Also `UniTaskCompletionSource` can await multiple times and await from many callers.
|
||||||
|
|
||||||
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 a `CancellationToken cancellationToken = default` parameter. Also some async operations for Unity have `WithCancellation(CancellationToken)` and `ToUniTask(..., CancellationToken cancellation = default)` extension methods.
|
||||||
|
|
||||||
You can pass `CancellationToken` to parameter by standard [`CancellationTokenSource`](https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource).
|
You can pass `CancellationToken` to parameter by standard [`CancellationTokenSource`](https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtokensource).
|
||||||
|
|
||||||
@@ -225,18 +236,18 @@ await UnityWebRequest.Get("http://google.co.jp").SendWebRequest().WithCancellati
|
|||||||
await UniTask.DelayFrame(1000, cancellationToken: cts.Token);
|
await UniTask.DelayFrame(1000, cancellationToken: cts.Token);
|
||||||
```
|
```
|
||||||
|
|
||||||
CancellationToken can create by `CancellationTokenSource` or MonoBehaviour's extension method `GetCancellationTokenOnDestroy`.
|
CancellationToken can be created by `CancellationTokenSource` or MonoBehaviour's extension method `GetCancellationTokenOnDestroy`.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// this CancellationToken lifecycle is same as GameObject.
|
// this CancellationToken lifecycle is same as GameObject.
|
||||||
await UniTask.DelayFrame(1000, cancellationToken: this.GetCancellationTokenOnDestroy());
|
await UniTask.DelayFrame(1000, cancellationToken: this.GetCancellationTokenOnDestroy());
|
||||||
```
|
```
|
||||||
|
|
||||||
When detect cancellation, all methods throws `OperationCanceledException` and propagate to upstream. `OperationCanceledException` is special exception, if not handled this exception, finally it is propagated to `UniTaskScheduler.UnobservedTaskException`.
|
When cancellation is detected, all methods throw `OperationCanceledException` and propagate upstream. `OperationCanceledException` is a special exception, if this exception is not handled, it is propagated finally to `UniTaskScheduler.UnobservedTaskException`.
|
||||||
|
|
||||||
Default behaviour of received unhandled exception is write log as exception. Log level can change by `UniTaskScheduler.UnobservedExceptionWriteLogType`. If you want to change custom beavhiour, set action to `UniTaskScheduler.UnobservedTaskException.`
|
The default behaviour of received unhandled exception is to write log as exception. Log level can be changed using `UniTaskScheduler.UnobservedExceptionWriteLogType`. If you want to use custom behaviour, set an action to `UniTaskScheduler.UnobservedTaskException.`
|
||||||
|
|
||||||
If you want to cancel behaviour in async UniTask method, throws `OperationCanceledException` manually.
|
If you want to cancel behaviour in an async UniTask method, throw `OperationCanceledException` manually.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public async UniTask<int> FooAsync()
|
public async UniTask<int> FooAsync()
|
||||||
@@ -246,7 +257,7 @@ public async UniTask<int> FooAsync()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you handle exception but want to ignore(propagete to global cancellation handling), use exception filter.
|
If you handle an exception but want to ignore(propagate to global cancellation handling), use an exception filter.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public async UniTask<int> BarAsync()
|
public async UniTask<int> BarAsync()
|
||||||
@@ -263,7 +274,7 @@ public async UniTask<int> BarAsync()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
throws/catch `OperationCanceledException` is slightly heavy, if you want to care performance, use `UniTask.SuppressCancellationThrow` to avoid OperationCanceledException throw. It returns `(bool IsCanceled, T Result)` instead of throw.
|
throws/catch `OperationCanceledException` is slightly heavy, so if performance is a concern, use `UniTask.SuppressCancellationThrow` to avoid OperationCanceledException throw. It returns `(bool IsCanceled, T Result)` instead of throwing.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
var (isCanceled, _) = await UniTask.DelayFrame(10, cancellationToken: cts.Token).SuppressCancellationThrow();
|
var (isCanceled, _) = await UniTask.DelayFrame(10, cancellationToken: cts.Token).SuppressCancellationThrow();
|
||||||
@@ -273,11 +284,11 @@ if (isCanceled)
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Note: Only suppress throws if you call it directly into the most source method. Otherwise, the return value will be converted, but the entire pipeline will not be suppressed throws.
|
Note: Only suppress throws if you call directly into the most source method. Otherwise, the return value will be converted, but the entire pipeline will not suppress throws.
|
||||||
|
|
||||||
Progress
|
Progress
|
||||||
---
|
---
|
||||||
Some async operation for unity have `ToUniTask(IProgress<float> progress = null, ...)` extension methods.
|
Some async operations for unity have `ToUniTask(IProgress<float> progress = null, ...)` extension methods.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
var progress = Progress.Create<float>(x => Debug.Log(x));
|
var progress = Progress.Create<float>(x => Debug.Log(x));
|
||||||
@@ -287,9 +298,9 @@ var request = await UnityWebRequest.Get("http://google.co.jp")
|
|||||||
.ToUniTask(progress: progress);
|
.ToUniTask(progress: progress);
|
||||||
```
|
```
|
||||||
|
|
||||||
You should not use standard `new System.Progress<T>`, because it causes allocation every times. Use `Cysharp.Threading.Tasks.Progress` instead. This progress factory has two methods, `Create` and `CreateOnlyValueChanged`. `CreateOnlyValueChanged` calls only when progress value changed.
|
You should not use standard `new System.Progress<T>`, because it causes allocation every time. Use `Cysharp.Threading.Tasks.Progress` instead. This progress factory has two methods, `Create` and `CreateOnlyValueChanged`. `CreateOnlyValueChanged` calls only when the progress value has changed.
|
||||||
|
|
||||||
Implements IProgress interface to caller is more better, there is no allocation of lambda.
|
Implementing IProgress interface to caller is better as there is no lambda allocation.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class Foo : MonoBehaviour, IProgress<float>
|
public class Foo : MonoBehaviour, IProgress<float>
|
||||||
@@ -310,7 +321,7 @@ public class Foo : MonoBehaviour, IProgress<float>
|
|||||||
|
|
||||||
PlayerLoop
|
PlayerLoop
|
||||||
---
|
---
|
||||||
UniTask is run on custom [PlayerLoop](https://docs.unity3d.com/ScriptReference/LowLevel.PlayerLoop.html). UniTask's playerloop based method(such as `Delay`, `DelayFrame`, `asyncOperation.ToUniTask`, etc...) accepts this `PlayerLoopTiming`.
|
UniTask is run on a custom [PlayerLoop](https://docs.unity3d.com/ScriptReference/LowLevel.PlayerLoop.html). UniTask's playerloop based methods (such as `Delay`, `DelayFrame`, `asyncOperation.ToUniTask`, etc...) accept this `PlayerLoopTiming`.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public enum PlayerLoopTiming
|
public enum PlayerLoopTiming
|
||||||
@@ -335,28 +346,35 @@ public enum PlayerLoopTiming
|
|||||||
|
|
||||||
PostLateUpdate = 12,
|
PostLateUpdate = 12,
|
||||||
LastPostLateUpdate = 13
|
LastPostLateUpdate = 13
|
||||||
|
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
TimeUpdate = 14,
|
||||||
|
LastTimeUpdate = 15,
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
It indicates when to run, you can check [PlayerLoopList.md](https://gist.github.com/neuecc/bc3a1cfd4d74501ad057e49efcd7bdae) to Unity's default playerloop and injected UniTask's custom loop.
|
It indicates when to run, you can check [PlayerLoopList.md](https://gist.github.com/neuecc/bc3a1cfd4d74501ad057e49efcd7bdae) to Unity's default playerloop and injected UniTask's custom loop.
|
||||||
|
|
||||||
`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 to `yield return null` in a 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 to `WaitForFixedUpdate`, `PlayerLoopTiming.LastPostLateUpdate` is similar to `WaitForEndOfFrame` in 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`.
|
> `await UniTask.WaitForEndOfFrame()` is not equivalent 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) do not work correctly when replaced with async/await. In these cases, use a coroutine instead.
|
||||||
|
|
||||||
> UniTask.Yield(without CancellationToken) is a special type, returns `YieldAwaitable` and run on YieldRunner. It is most lightweight and faster.
|
`yield return null` and `UniTask.Yield` are similar but different. `yield return null` always returns next frame but `UniTask.Yield` returns next called. That is, call `UniTask.Yield(PlayerLoopTiming.Update)` on `PreUpdate`, it returns same frame. `UniTask.NextFrame()` guarantees return next frame, you can expect this to behave exactly the same as `yield return null`.
|
||||||
|
|
||||||
AsyncOperation is returned from native timing. For example, await `SceneManager.LoadSceneAsync` is returned from `EarlyUpdate.UpdatePreloading` and after called, loaded scene called from `EarlyUpdate.ScriptRunDelayedStartupFrame`. Also `await UnityWebRequest` is returned from `EarlyUpdate.ExecuteMainThreadJobs`.
|
> UniTask.Yield(without CancellationToken) is a special type, returns `YieldAwaitable` and run on YieldRunner. It is most lightweight and fastest.
|
||||||
|
|
||||||
In UniTask, await directly and `WithCancellation` use native timing, `ToUniTask` use specified timing. This is usually not a particular problem, but with `LoadSceneAsync`, causes different order of Start and continuation after await. so recommend not to use `LoadSceneAsync.ToUniTask`.
|
`AsyncOperation` is returned from native timing. For example, await `SceneManager.LoadSceneAsync` is returned from `EarlyUpdate.UpdatePreloading` and after being called, the loaded scene's `Start` is called from `EarlyUpdate.ScriptRunDelayedStartupFrame`. Also `await UnityWebRequest` is returned from `EarlyUpdate.ExecuteMainThreadJobs`.
|
||||||
|
|
||||||
In stacktrace, you can check where is running in playerloop.
|
In UniTask, await directly and `WithCancellation` use native timing, `ToUniTask` uses specified timing. This is usually not a particular problem, but with `LoadSceneAsync`, it causes a different order of Start and continuation after await. So it is recommended not to use `LoadSceneAsync.ToUniTask`.
|
||||||
|
|
||||||
|
In the stacktrace, you can check where it is running in playerloop.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
In default, UniTask's PlayerLoop is initialized at `[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]`.
|
By default, UniTask's PlayerLoop is initialized at `[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]`.
|
||||||
|
|
||||||
The order in which methods are called in BeforeSceneLoad is indeterminate, so if you want to use UniTask in other BeforeSceneLoad methods, you should try to initialize it before this.
|
The order in which methods are called in BeforeSceneLoad is nondeterministic, so if you want to use UniTask in other BeforeSceneLoad methods, you should try to initialize it before this.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// AfterAssembliesLoaded is called before BeforeSceneLoad
|
// AfterAssembliesLoaded is called before BeforeSceneLoad
|
||||||
@@ -368,9 +386,9 @@ public static void InitUniTaskLoop()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If you import Unity's `Entities` package, that reset custom player loop to default at `BeforeSceneLoad` and inject ECS's loop. When Unity call ECS's inject method after UniTask's initialize method, UniTask will no longer work.
|
If you import Unity's `Entities` package, that resets the custom player loop to default at `BeforeSceneLoad` and injects ECS's loop. When Unity calls ECS's inject method after UniTask's initialize method, UniTask will no longer work.
|
||||||
|
|
||||||
To solve this issue, you can re-initialize UniTask PlayerLoop after ECS initialized.
|
To solve this issue, you can re-initialize the UniTask PlayerLoop after ECS is initialized.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Get ECS Loop.
|
// Get ECS Loop.
|
||||||
@@ -380,9 +398,19 @@ var playerLoop = ScriptBehaviourUpdateOrder.CurrentPlayerLoop;
|
|||||||
PlayerLoopHelper.Initialize(ref playerLoop);
|
PlayerLoopHelper.Initialize(ref playerLoop);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can diagnose whether UniTask's player loop is ready by calling `PlayerLoopHelper.IsInjectedUniTaskPlayerLoop()`. And also `PlayerLoopHelper.DumpCurrentPlayerLoop` logs all current playerloops to console.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.Log("UniTaskPlayerLoop ready? " + PlayerLoopHelper.IsInjectedUniTaskPlayerLoop());
|
||||||
|
PlayerLoopHelper.DumpCurrentPlayerLoop();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
async void vs async UniTaskVoid
|
async void vs async UniTaskVoid
|
||||||
---
|
---
|
||||||
`async void` is a standard C# taks system so does not run on UniTask systems. It is better not to use. `async UniTaskVoid` is a lightweight version of `async UniTask` because it does not have awaitable completion and report error immediately to `UniTaskScheduler.UnobservedTaskException`. If you don't require to await it(fire and forget), use `UniTaskVoid` is better. Unfortunately to dismiss warning, require to using with `Forget()`.
|
`async void` is a standard C# task system so it does not run on UniTask systems. It is better not to use it. `async UniTaskVoid` is a lightweight version of `async UniTask` because it does not have awaitable completion and reports errors immediately to `UniTaskScheduler.UnobservedTaskException`. If you don't require awaiting (fire and forget), using `UniTaskVoid` is better. Unfortunately to dismiss warning, you're required to call `Forget()`.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public async UniTaskVoid FireAndForgetMethod()
|
public async UniTaskVoid FireAndForgetMethod()
|
||||||
@@ -397,7 +425,7 @@ public void Caller()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Also UniTask have `Forget` method, it is similar with UniTaskVoid and same effects with it. However still UniTaskVoid is more efficient if completely do not use await。
|
Also UniTask has the `Forget` method, it is similar to `UniTaskVoid` and has the same effects. However `UniTaskVoid` is more efficient if you completely don't use `await`。
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public async UniTask DoAsync()
|
public async UniTask DoAsync()
|
||||||
@@ -412,7 +440,7 @@ public void Caller()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Using async lambda in register event, it is used `async void`. To avoid it, you can use `UniTask.Action` or `UniTask.UnityAction` that creates delegate via `async UniTaskVoid` lambda.
|
To use an async lambda registered to an event, don't use `async void`. Instead you can use `UniTask.Action` or `UniTask.UnityAction`, both of which create a delegate via `async UniTaskVoid` lambda.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
Action actEvent;
|
Action actEvent;
|
||||||
@@ -427,9 +455,21 @@ actEvent += UniTask.Action(async () => { await UniTask.Yield(); });
|
|||||||
unityEvent += UniTask.UnityAction(async () => { await UniTask.Yield(); });
|
unityEvent += UniTask.UnityAction(async () => { await UniTask.Yield(); });
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`UniTaskVoid` can also be used in MonoBehaviour's `Start` method.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
class Sample : MonoBehaviour
|
||||||
|
{
|
||||||
|
async UniTaskVoid Start()
|
||||||
|
{
|
||||||
|
// async init code.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
UniTaskTracker
|
UniTaskTracker
|
||||||
---
|
---
|
||||||
useful for check(leak) UniTasks. You can open tracker window in `Window -> UniTask Tracker`.
|
useful for checking (leaked) UniTasks. You can open tracker window in `Window -> UniTask Tracker`.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -439,13 +479,15 @@ useful for check(leak) UniTasks. You can open tracker window in `Window -> UniTa
|
|||||||
* Enable Tracking(Toggle) - Start to track async/await UniTask. Performance impact: low.
|
* Enable Tracking(Toggle) - Start to track async/await UniTask. Performance impact: low.
|
||||||
* Enable StackTrace(Toggle) - Capture StackTrace when task is started. Performance impact: high.
|
* Enable StackTrace(Toggle) - Capture StackTrace when task is started. Performance impact: high.
|
||||||
|
|
||||||
For debug use, enable tracking and capture stacktrace is useful but it it decline performance. Recommended usage is enable both to find task leak, and when done, finally disable both.
|
UniTaskTracker is intended for debugging use only as enabling tracking and capturing stacktraces is useful but has a heavy performance impact. Recommended usage is to enable both tracking and stacktraces to find task leaks and to disable them both when done.
|
||||||
|
|
||||||
External Assets
|
External Assets
|
||||||
---
|
---
|
||||||
In default, UniTask supports DOTween and Addressables(`AsyncOperationHandle` and `AsyncOpereationHandle<T>` as awaitable).
|
By default, UniTask supports TextMeshPro(`BindTo(TMP_Text)` and `TMP_InputField` event extensions like standard uGUI `InputField`), DOTween(`Tween` as awaitable) and Addressables(`AsyncOperationHandle` and `AsyncOperationHandle<T>` as awaitable).
|
||||||
|
|
||||||
For DOTween support, require to `com.demigiant.dotween` import from [OpenUPM](https://openupm.com/packages/com.demigiant.dotween/) or define `UNITASK_DOTWEEN_SUPPORT` to enable it.
|
There are defined in separated asmdefs like `UniTask.TextMeshPro`, `UniTask.DOTween`, `UniTask.Addressables`.
|
||||||
|
|
||||||
|
TextMeshPro and Addressables support are automatically enabled when importing their packages from package manager. However for DOTween support, it is required to import `com.demigiant.dotween` from [OpenUPM](https://openupm.com/packages/com.demigiant.dotween/) or to define `UNITASK_DOTWEEN_SUPPORT` to enable it.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// sequential
|
// sequential
|
||||||
@@ -460,12 +502,14 @@ await UniTask.WhenAll(
|
|||||||
transform.DOScale(10, 3).WithCancellation(ct));
|
transform.DOScale(10, 3).WithCancellation(ct));
|
||||||
```
|
```
|
||||||
|
|
||||||
|
DOTween support's default behaviour(`await`, `WithCancellation`, `ToUniTask`) awaits tween is killed. It works on both Complete(true/false) and Kill(true/false). But if you want to reuse tweens (`SetAutoKill(false)`), it does not work as expected. If you want to await for another timing, the following extension methods exist in Tween, `AwaitForComplete`, `AwaitForPause`, `AwaitForPlay`, `AwaitForRewind`, `AwaitForStepComplete`.
|
||||||
|
|
||||||
AsyncEnumerable and Async LINQ
|
AsyncEnumerable and Async LINQ
|
||||||
---
|
---
|
||||||
Unity 2020.2.0a12 supports C# 8.0 so you can use `await foreach`. This is the new Update notation in async era.
|
Unity 2020.2 supports C# 8.0 so you can use `await foreach`. This is the new Update notation in the async era.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// Unity 2020.2.0a12, C# 8.0
|
// Unity 2020.2, C# 8.0
|
||||||
await foreach (var _ in UniTaskAsyncEnumerable.EveryUpdate(token))
|
await foreach (var _ in UniTaskAsyncEnumerable.EveryUpdate(token))
|
||||||
{
|
{
|
||||||
Debug.Log("Update() " + Time.frameCount);
|
Debug.Log("Update() " + Time.frameCount);
|
||||||
@@ -490,11 +534,19 @@ await okButton.OnClickAsAsyncEnumerable().Where((x, i) => i % 2 == 0).ForEachAsy
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Fire and Forget style(for example, event handling), you can also use `Subscribe`.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
okButton.OnClickAsAsyncEnumerable().Where((x, i) => i % 2 == 0).Subscribe(_ =>
|
||||||
|
{
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
Async LINQ is enabled when `using Cysharp.Threading.Tasks.Linq;`, and `UniTaskAsyncEnumerable` is defined in `UniTask.Linq` asmdef.
|
Async LINQ is enabled when `using Cysharp.Threading.Tasks.Linq;`, and `UniTaskAsyncEnumerable` is defined in `UniTask.Linq` asmdef.
|
||||||
|
|
||||||
It's closer to UniRx (Reactive Extensions), but UniTaskAsyncEnumerable is a pull-based asynchronous stream, whereas Rx was a push-based asynchronous stream. Note that although similar, the characteristics are different and the details behave differently along with them.
|
It's closer to UniRx (Reactive Extensions), but UniTaskAsyncEnumerable is a pull-based asynchronous stream, whereas Rx was a push-based asynchronous stream. Note that although similar, the characteristics are different and the details behave differently along with them.
|
||||||
|
|
||||||
`UniTaskAsyncEnumerable` is the entry point like `Enumerbale`. In addition to the standard query operators, there are other generators for Unity such as `EveryUpdate`, `Timer`, `TimerFrame`, `Interval`, `IntervalFrame`, and `EveryValueChanged`. And also added additional UniTask original query operators like `Append`, `Prepend`, `DistinctUntilChanged`, `ToHashSet`, `Buffer`, `CombineLatest`, `Do`, `Never`, `ForEachAsync`, `Pairwise`, `Publish`, `Queue`, `Return`, `SkipUntilCanceled`, `TakeUntilCanceled`, `TakeLast`.
|
`UniTaskAsyncEnumerable` is the entry point like `Enumerbale`. In addition to the standard query operators, there are other generators for Unity such as `EveryUpdate`, `Timer`, `TimerFrame`, `Interval`, `IntervalFrame`, and `EveryValueChanged`. And also added additional UniTask original query operators like `Append`, `Prepend`, `DistinctUntilChanged`, `ToHashSet`, `Buffer`, `CombineLatest`, `Do`, `Never`, `ForEachAsync`, `Pairwise`, `Publish`, `Queue`, `Return`, `SkipUntil`, `TakeUntil`, `SkipUntilCanceled`, `TakeUntilCanceled`, `TakeLast`, `Subscribe`.
|
||||||
|
|
||||||
The method with Func as an argument has three additional overloads, `***Await`, `***AwaitWithCancellation`.
|
The method with Func as an argument has three additional overloads, `***Await`, `***AwaitWithCancellation`.
|
||||||
|
|
||||||
@@ -506,6 +558,38 @@ SelectAwaitWithCancellation(Func<T, CancellationToken, UniTask<TR>> selector)
|
|||||||
|
|
||||||
If you want to use the `async` method inside the func, use the `***Await` or `***AwaitWithCancellation`.
|
If you want to use the `async` method inside the func, use the `***Await` or `***AwaitWithCancellation`.
|
||||||
|
|
||||||
|
How to create an async iterator: C# 8.0 supports async iterator(`async yield return`) but it only allows `IAsyncEnumerable<T>` and of course requires C# 8.0. UniTask supports `UniTaskAsyncEnumerable.Create` method to create custom async iterator.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// IAsyncEnumerable, C# 8.0 version of async iterator. ( do not use this style, IAsyncEnumerable is not controled in UniTask).
|
||||||
|
public async IAsyncEnumerable<int> MyEveryUpdate([EnumeratorCancellation]CancellationToken cancelationToken = default)
|
||||||
|
{
|
||||||
|
var frameCount = 0;
|
||||||
|
await UniTask.Yield();
|
||||||
|
while (!token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
yield return frameCount++;
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UniTaskAsyncEnumerable.Create and use `await writer.YieldAsync` instead of `yield return`.
|
||||||
|
public IUniTaskAsyncEnumerable<int> MyEveryUpdate()
|
||||||
|
{
|
||||||
|
// writer(IAsyncWriter<T>) has `YieldAsync(value)` method.
|
||||||
|
return UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
var frameCount = 0;
|
||||||
|
await UniTask.Yield();
|
||||||
|
while (!token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
await writer.YieldAsync(frameCount++); // instead of `yield return`
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Awaitable Events
|
Awaitable Events
|
||||||
---
|
---
|
||||||
All uGUI component implements `***AsAsyncEnumerable` to convert asynchronous streams of events.
|
All uGUI component implements `***AsAsyncEnumerable` to convert asynchronous streams of events.
|
||||||
@@ -550,7 +634,7 @@ async UniTask TripleClick(CancellationToken token)
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
All MonoBehaviour message events can convert async-streams by `AsyncTriggers` that can enable by `using Cysharp.Threading.Tasks.Triggers;`.
|
All MonoBehaviour message events can convert async-streams by `AsyncTriggers` that can be enabled by `using Cysharp.Threading.Tasks.Triggers;`.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
using Cysharp.Threading.Tasks.Triggers;
|
using Cysharp.Threading.Tasks.Triggers;
|
||||||
@@ -566,7 +650,7 @@ async UniTaskVoid MonitorCollision()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Similar as uGUI event, AsyncTrigger can get by `GetAsync***Trigger` and trigger it self is UniTaskAsyncEnumerable.
|
Similar to uGUI event, AsyncTrigger can be created using `GetAsync***Trigger` and triggers itself as UniTaskAsyncEnumerable.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// use await multiple times, get AsyncTriggerHandler is more efficient.
|
// use await multiple times, get AsyncTriggerHandler is more efficient.
|
||||||
@@ -583,41 +667,71 @@ await this.GetAsyncMoveTrigger().ForEachAsync(axisEventData =>
|
|||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
`AsyncReactiveProperty`, `AsyncReadOnlyReactiveProperty` is UniTask version of UniTask's ReactiveProperty.
|
`AsyncReactiveProperty`, `AsyncReadOnlyReactiveProperty` is UniTask's version of ReactiveProperty. `BindTo` extension method of `IUniTaskAsyncEnumerable<T>` for binding asynchronous stream values to Unity components(Text/Selectable/TMP/Text).
|
||||||
|
|
||||||
`BindTo` extension method of `IUniTaskAsyncEnumerable<T>` for binding asynchronous stream values to Unity components(Text/Selectable/TMP/Text).
|
```csharp
|
||||||
|
var rp = new AsyncReactiveProperty<int>(99);
|
||||||
|
|
||||||
|
// AsyncReactiveProperty itself is IUniTaskAsyncEnumerable, you can query by LINQ
|
||||||
|
rp.ForEachAsync(x =>
|
||||||
|
{
|
||||||
|
Debug.Log(x);
|
||||||
|
}, this.GetCancellationTokenOnDestroy()).Forget();
|
||||||
|
|
||||||
|
rp.Value = 10; // push 10 to all subscriber
|
||||||
|
rp.Value = 11; // push 11 to all subscriber
|
||||||
|
|
||||||
|
// WithoutCurrent ignore initial value
|
||||||
|
// BindTo bind stream value to unity components.
|
||||||
|
rp.WithoutCurrent().BindTo(this.textComponent);
|
||||||
|
|
||||||
|
await rp.WaitAsync(); // wait until next value set
|
||||||
|
|
||||||
|
// also exists ToReadOnlyReactiveProperty
|
||||||
|
var rp2 = new AsyncReactiveProperty<int>(99);
|
||||||
|
var rorp = rp.CombineLatest(rp2, (x, y) => (x, y)).ToReadOnlyReactiveProperty();
|
||||||
|
```
|
||||||
|
|
||||||
A pull-type asynchronous stream does not get the next values until the asynchronous processing in the sequence is complete. This could spill data from push-type events such as buttons.
|
A pull-type asynchronous stream does not get the next values until the asynchronous processing in the sequence is complete. This could spill data from push-type events such as buttons.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// can not get click event during 3 seconds complete.
|
// can not get click event during 3 seconds complete.
|
||||||
await button.OnClickAsAsyncEnumerable().ForEachAwaitAsync()
|
await button.OnClickAsAsyncEnumerable().ForEachAwaitAsync(async x =>
|
||||||
{
|
{
|
||||||
await UniTask.Delay(TimeSpan.FromSeconds(3));
|
await UniTask.Delay(TimeSpan.FromSeconds(3));
|
||||||
}
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
It is useful(prevent double-click) but not useful in sometimes.
|
It is useful (prevent double-click) but not useful sometimes.
|
||||||
|
|
||||||
Using `Queue()` method, which will also queue events during asynchronous processing.
|
Using the `Queue()` method will also queue events during asynchronous processing.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
// queued message in asynchronous processing
|
// queued message in asynchronous processing
|
||||||
await button.OnClickAsAsyncEnumerable().Queue().ForEachAwaitAsync()
|
await button.OnClickAsAsyncEnumerable().Queue().ForEachAwaitAsync(async x =>
|
||||||
{
|
{
|
||||||
await UniTask.Delay(TimeSpan.FromSeconds(3));
|
await UniTask.Delay(TimeSpan.FromSeconds(3));
|
||||||
}
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use `Subscribe`, fire and forget style.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
button.OnClickAsAsyncEnumerable().Subscribe(async x =>
|
||||||
|
{
|
||||||
|
await UniTask.Delay(TimeSpan.FromSeconds(3));
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
Channel
|
Channel
|
||||||
---
|
---
|
||||||
`Channel` is same as [System.Threading.Tasks.Channels](https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.channels?view=netcore-3.1) that is similar as GoLang Channel.
|
`Channel` is the same as [System.Threading.Tasks.Channels](https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.channels?view=netcore-3.1) which is similar to a GoLang Channel.
|
||||||
|
|
||||||
Currently only supports multiple-producer, single-consumer unbounded channel. It can create by `Channel.CreateSingleConsumerUnbounded<T>()`.
|
Currently it only supports multiple-producer, single-consumer unbounded channels. It can create by `Channel.CreateSingleConsumerUnbounded<T>()`.
|
||||||
|
|
||||||
For producer(`.Writer`), `TryWrite` to push value and `TryComplete` to complete channel. For consumer(`.Reader`), `TryRead`, `WaitToReadAsync`, `ReadAsync`, `Completion` and `ReadAllAsync` to read queued messages.
|
For producer(`.Writer`), use `TryWrite` to push value and `TryComplete` to complete channel. For consumer(`.Reader`), use `TryRead`, `WaitToReadAsync`, `ReadAsync`, `Completion` and `ReadAllAsync` to read queued messages.
|
||||||
|
|
||||||
`ReadAllAsync` returns `IUniTaskAsyncEnumerable<T>` so query LINQ operators. Reader only allows single-consumer but use `.Publish()` query operator to enable multicast message. For example, make pub/sub utility.
|
`ReadAllAsync` returns `IUniTaskAsyncEnumerable<T>` so query LINQ operators. Reader only allows single-consumer but uses `.Publish()` query operator to enable multicast message. For example, make pub/sub utility.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class AsyncMessageBroker<T> : IDisposable
|
public class AsyncMessageBroker<T> : IDisposable
|
||||||
@@ -654,7 +768,7 @@ public class AsyncMessageBroker<T> : IDisposable
|
|||||||
|
|
||||||
For Unit Testing
|
For Unit Testing
|
||||||
---
|
---
|
||||||
Unity's `[UnityTest]` attribute can test coroutine(IEnumerator) but can not test async. `UniTask.ToCoroutine` bridges async/await to coroutine so you can test async method.
|
Unity's `[UnityTest]` attribute can test coroutine(IEnumerator) but can not test async. `UniTask.ToCoroutine` bridges async/await to coroutine so you can test async methods.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
[UnityTest]
|
[UnityTest]
|
||||||
@@ -677,11 +791,79 @@ 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's own unit tests are written using Unity Test Runner and [Cysharp/RuntimeUnitTestToolkit](https://github.com/Cysharp/RuntimeUnitTestToolkit) to integrate with CI and check if IL2CPP is working.
|
||||||
|
|
||||||
|
ThreadPool limitation
|
||||||
|
---
|
||||||
|
Most UniTask methods run on a single thread (PlayerLoop), with only `UniTask.Run` and `UniTask.SwitchToThreadPool` running 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. 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 it has some limitations.
|
||||||
|
|
||||||
|
* `WaitForEndOfFrame`/`WaitForFixedUpdate`/`Coroutine` is not supported.
|
||||||
|
* Consuming loop timing is not the same as `StartCoroutine`, it uses the specified `PlayerLoopTiming` and the default `PlayerLoopTiming.Update` is run before MonoBehaviour's `Update` and `StartCoroutine`'s loop.
|
||||||
|
|
||||||
|
If you want fully compatible conversion from coroutine to async, use the `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 Editor like an Editor Coroutine. However, there are some limitations.
|
||||||
|
|
||||||
|
* Delay, DelayFrame do not work correctly because they 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 the timing `EditorApplication.update`.
|
||||||
|
|
||||||
|
Compare with Standard Task API
|
||||||
|
---
|
||||||
|
UniTask has many standard Task-like APIs. This table shows what the alternative apis are.
|
||||||
|
|
||||||
|
Use standard type.
|
||||||
|
|
||||||
|
| .NET Type | UniTask Type |
|
||||||
|
| --- | --- |
|
||||||
|
| `IProgress<T>` | --- |
|
||||||
|
| `CancellationToken` | --- |
|
||||||
|
| `CancellationTokenSource` | --- |
|
||||||
|
|
||||||
|
Use UniTask type.
|
||||||
|
|
||||||
|
| .NET Type | UniTask Type |
|
||||||
|
| --- | --- |
|
||||||
|
| `Task`/`ValueTask` | `UniTask` |
|
||||||
|
| `Task<T>`/`ValueTask<T>` | `UniTask<T>` |
|
||||||
|
| `async void` | `async UniTaskVoid` |
|
||||||
|
| `+= async () => { }` | `UniTask.Void`, `UniTask.Action`, `UniTask.UnityAction` |
|
||||||
|
| --- | `UniTaskCompletionSource` |
|
||||||
|
| `TaskCompletionSource<T>` | `UniTaskCompletionSource<T>`/`AutoResetUniTaskCompletionSource<T>` |
|
||||||
|
| `ManualResetValueTaskSourceCore<T>` | `UniTaskCompletionSourceCore<T>` |
|
||||||
|
| `IValueTaskSource` | `IUniTaskSource` |
|
||||||
|
| `IValueTaskSource<T>` | `IUniTaskSource<T>` |
|
||||||
|
| `ValueTask.IsCompleted` | `UniTask.Status.IsCompleted()` |
|
||||||
|
| `ValueTask<T>.IsCompleted` | `UniTask<T>.Status.IsCompleted()` |
|
||||||
|
| `new Progress<T>` | `Progress.Create<T>` |
|
||||||
|
| `CancellationToken.Register(UnsafeRegister)` | `CancellationToken.RegisterWithoutCaptureExecutionContext` |
|
||||||
|
| `CancellationTokenSource.CancelAfter` | `CancellationTokenSource.CancelAfterSlim` |
|
||||||
|
| `Channel.CreateUnbounded<T>(false){ SingleReader = true }` | `Channel.CreateSingleConsumerUnbounded<T>` |
|
||||||
|
| `IAsyncEnumerable<T>` | `IUniTaskAsyncEnumerable<T>` |
|
||||||
|
| `IAsyncEnumerator<T>` | `IUniTaskAsyncEnumerator<T>` |
|
||||||
|
| `IAsyncDisposable` | `IUniTaskAsyncDisposable` |
|
||||||
|
| `Task.Delay` | `UniTask.Delay` |
|
||||||
|
| `Task.Yield` | `UniTask.Yield` |
|
||||||
|
| `Task.Run` | `UniTask.Run` |
|
||||||
|
| `Task.WhenAll` | `UniTask.WhenAll` |
|
||||||
|
| `Task.WhenAny` | `UniTask.WhenAny` |
|
||||||
|
| `Task.CompletedTask` | `UniTask.CompletedTask` |
|
||||||
|
| `Task.FromException` | `UniTask.FromException` |
|
||||||
|
| `Task.FromResult` | `UniTask.FromResult` |
|
||||||
|
| `Task.FromCanceled` | `UniTask.FromCanceled` |
|
||||||
|
| `Task.ContinueWith` | `UniTask.ContinueWith` |
|
||||||
|
| `TaskScheduler.UnobservedTaskException` | `UniTaskScheduler.UnobservedTaskException` |
|
||||||
|
|
||||||
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 aggressively caches async promise objects to achieve zero allocation (for 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)). By default, it caches all promises but you can configure `TaskPool.SetMaxPoolSize` to your value, the value indicates cache size per type. `TaskPool.GetCacheSizeInfo` returns currently cached objects in pool.
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
foreach (var (type, size) in TaskPool.GetCacheSizeInfo())
|
foreach (var (type, size) in TaskPool.GetCacheSizeInfo())
|
||||||
@@ -690,17 +872,44 @@ foreach (var (type, size) in TaskPool.GetCacheSizeInfo())
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Allocation on Profiler
|
||||||
|
---
|
||||||
|
In UnityEditor the profiler shows allocation of compiler generated AsyncStateMachine but it only occurs in debug(development) build. C# Compiler generates AsyncStateMachine as class on Debug build and as struct on Release build.
|
||||||
|
|
||||||
|
Unity supports Code Optimization option starting in 2020.1 (right, footer).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You can change C# compiler optimization to release to remove AsyncStateMachine allocation in development builds. This optimization option can also be set via `Compilation.CompilationPipeline-codeOptimization`, and `Compilation.CodeOptimization`.
|
||||||
|
|
||||||
|
UniTaskSynchronizationContext
|
||||||
|
---
|
||||||
|
Unity's default SynchronizationContext(`UnitySynchronizationContext`) is a poor implementation for performance. UniTask bypasses `SynchronizationContext`(and `ExecutionContext`) so it does not use it but if exists in `async Task`, still used it. `UniTaskSynchronizationContext` is a replacement of `UnitySynchronizationContext` which is better for performance.
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
public class SyncContextInjecter
|
||||||
|
{
|
||||||
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)]
|
||||||
|
public static void Inject()
|
||||||
|
{
|
||||||
|
SynchronizationContext.SetSynchronizationContext(new UniTaskSynchronizationContext());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This is an optional choice and is not always recommended; `UniTaskSynchronizationContext` is less performant than `async UniTask` and is not a complete UniTask replacement. It also does not guarantee full behavioral compatibility with the `UnitySynchronizationContext`.
|
||||||
|
|
||||||
API References
|
API References
|
||||||
---
|
---
|
||||||
UniTask's API References is hosted at [cysharp.github.io/UniTask](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.html) by [DocFX](https://dotnet.github.io/docfx/) and [Cysharp/DocfXTemplate](https://github.com/Cysharp/DocfxTemplate).
|
UniTask's API References are hosted at [cysharp.github.io/UniTask](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.html) by [DocFX](https://dotnet.github.io/docfx/) and [Cysharp/DocfXTemplate](https://github.com/Cysharp/DocfxTemplate).
|
||||||
|
|
||||||
For example, UniTask's factory methods can see at [UniTask#methods](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.UniTask.html#methods-1). UniTaskAsyncEnumerable's factory/extension methods can see at [UniTaskAsyncEnumerable#methods](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.Linq.UniTaskAsyncEnumerable.html#methods-1).
|
For example, UniTask's factory methods can be seen at [UniTask#methods](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.UniTask.html#methods-1). UniTaskAsyncEnumerable's factory/extension methods can be seen at [UniTaskAsyncEnumerable#methods](https://cysharp.github.io/UniTask/api/Cysharp.Threading.Tasks.Linq.UniTaskAsyncEnumerable.html#methods-1).
|
||||||
|
|
||||||
UPM Package
|
UPM Package
|
||||||
---
|
---
|
||||||
### Install via git URL
|
### Install via git URL
|
||||||
|
|
||||||
After Unity 2019.3.4f1, Unity 2020.1a21, that support path query parameter of git package. You can add `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask` to Package Manager
|
Requires a version of unity that supports path query parameter for git packages (Unity >= 2019.3.4f1, Unity >= 2020.1a21). You can add `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask` to Package Manager
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -708,7 +917,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.13`. For example `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.0.13`.
|
If you want to set a target version, UniTask uses the `*.*.*` release tag so you can specify a version like `#2.1.0`. For example `https://github.com/Cysharp/UniTask.git?path=src/UniTask/Assets/Plugins/UniTask#2.1.0`.
|
||||||
|
|
||||||
### Install via OpenUPM
|
### Install via OpenUPM
|
||||||
|
|
||||||
@@ -724,11 +933,11 @@ For .NET Core, use NuGet.
|
|||||||
|
|
||||||
> PM> Install-Package [UniTask](https://www.nuget.org/packages/UniTask)
|
> PM> Install-Package [UniTask](https://www.nuget.org/packages/UniTask)
|
||||||
|
|
||||||
UniTask of .NET Core version is a subset of Unity UniTask, removed PlayerLoop dependent methods.
|
UniTask of .NET Core version is a subset of Unity UniTask with PlayerLoop dependent methods removed.
|
||||||
|
|
||||||
It runs at higher performance than the standard Task/ValueTask, but you should be careful to ignore the ExecutionContext/SynchronizationContext when using it. `AysncLocal` also does not work because it ignores ExecutionContext.
|
It runs at higher performance than the standard Task/ValueTask, but you should be careful to ignore the ExecutionContext/SynchronizationContext when using it. `AysncLocal` also does not work because it ignores ExecutionContext.
|
||||||
|
|
||||||
If you use UniTask internally, but provide ValueTask as an external API, you can write like the following(Inspired by [PooledAwait](https://github.com/mgravell/PooledAwait)).
|
If you use UniTask internally, but provide ValueTask as an external API, you can write it like the following(Inspired by [PooledAwait](https://github.com/mgravell/PooledAwait)).
|
||||||
|
|
||||||
```csharp
|
```csharp
|
||||||
public class ZeroAllocAsyncAwaitInDotNetCore
|
public class ZeroAllocAsyncAwaitInDotNetCore
|
||||||
@@ -761,7 +970,7 @@ public ValueTask TestAsync()
|
|||||||
|
|
||||||
.NET Core version is intended to allow users to use UniTask as an interface when sharing code with Unity (such as [Cysharp/MagicOnion](https://github.com/Cysharp/MagicOnion/)). .NET Core version of UniTask enables smooth code sharing.
|
.NET Core version is intended to allow users to use UniTask as an interface when sharing code with Unity (such as [Cysharp/MagicOnion](https://github.com/Cysharp/MagicOnion/)). .NET Core version of UniTask enables smooth code sharing.
|
||||||
|
|
||||||
Utility methods such as WhenAll which is equivalent to UniTask are provided as [Cysharp/ValueTaskSupplement](https://github.com/Cysharp/ValueTaskSupplement).
|
Utility methods such as WhenAll which are equivalent to UniTask are provided as [Cysharp/ValueTaskSupplement](https://github.com/Cysharp/ValueTaskSupplement).
|
||||||
|
|
||||||
License
|
License
|
||||||
---
|
---
|
||||||
|
|||||||
101
src/UniTask.NetCore/NetCore/AsyncEnumerableExtensions.cs
Normal file
101
src/UniTask.NetCore/NetCore/AsyncEnumerableExtensions.cs
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#if !NETSTANDARD2_0
|
||||||
|
|
||||||
|
#pragma warning disable 0649
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Threading.Tasks.Sources;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static class AsyncEnumerableExtensions
|
||||||
|
{
|
||||||
|
public static IUniTaskAsyncEnumerable<T> AsUniTaskAsyncEnumerable<T>(this IAsyncEnumerable<T> source)
|
||||||
|
{
|
||||||
|
return new AsyncEnumerableToUniTaskAsyncEnumerable<T>(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncEnumerable<T> AsAsyncEnumerable<T>(this IUniTaskAsyncEnumerable<T> source)
|
||||||
|
{
|
||||||
|
return new UniTaskAsyncEnumerableToAsyncEnumerable<T>(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AsyncEnumerableToUniTaskAsyncEnumerable<T> : IUniTaskAsyncEnumerable<T>
|
||||||
|
{
|
||||||
|
readonly IAsyncEnumerable<T> source;
|
||||||
|
|
||||||
|
public AsyncEnumerableToUniTaskAsyncEnumerable(IAsyncEnumerable<T> source)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IUniTaskAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return new Enumerator(source.GetAsyncEnumerator(cancellationToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Enumerator : IUniTaskAsyncEnumerator<T>
|
||||||
|
{
|
||||||
|
readonly IAsyncEnumerator<T> enumerator;
|
||||||
|
|
||||||
|
public Enumerator(IAsyncEnumerator<T> enumerator)
|
||||||
|
{
|
||||||
|
this.enumerator = enumerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Current => enumerator.Current;
|
||||||
|
|
||||||
|
public async UniTask DisposeAsync()
|
||||||
|
{
|
||||||
|
await enumerator.DisposeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async UniTask<bool> MoveNextAsync()
|
||||||
|
{
|
||||||
|
return await enumerator.MoveNextAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class UniTaskAsyncEnumerableToAsyncEnumerable<T> : IAsyncEnumerable<T>
|
||||||
|
{
|
||||||
|
readonly IUniTaskAsyncEnumerable<T> source;
|
||||||
|
|
||||||
|
public UniTaskAsyncEnumerableToAsyncEnumerable(IUniTaskAsyncEnumerable<T> source)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return new Enumerator(source.GetAsyncEnumerator(cancellationToken));
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class Enumerator : IAsyncEnumerator<T>
|
||||||
|
{
|
||||||
|
readonly IUniTaskAsyncEnumerator<T> enumerator;
|
||||||
|
|
||||||
|
public Enumerator(IUniTaskAsyncEnumerator<T> enumerator)
|
||||||
|
{
|
||||||
|
this.enumerator = enumerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Current => enumerator.Current;
|
||||||
|
|
||||||
|
public ValueTask DisposeAsync()
|
||||||
|
{
|
||||||
|
return enumerator.DisposeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ValueTask<bool> MoveNextAsync()
|
||||||
|
{
|
||||||
|
return enumerator.MoveNextAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -26,15 +26,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<T> AsUniTask<T>(this ValueTask<T> task, bool useCurrentSynchronizationContext = true)
|
public static async UniTask<T> AsUniTask<T>(this ValueTask<T> task)
|
||||||
{
|
{
|
||||||
// NOTE: get _obj and _token directly for low overhead conversion but not yet implemented.
|
return await task;
|
||||||
return task.AsTask().AsUniTask(useCurrentSynchronizationContext);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask AsUniTask(this ValueTask task, bool useCurrentSynchronizationContext = true)
|
public static async UniTask AsUniTask(this ValueTask task)
|
||||||
{
|
{
|
||||||
return task.AsTask().AsUniTask(useCurrentSynchronizationContext);
|
await task;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if NETSTANDARD2_0
|
#if NETSTANDARD2_0
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -36,7 +36,9 @@
|
|||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\DiagnosticsExtensions.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\DiagnosticsExtensions.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\PlayerLoopRunner.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\PlayerLoopRunner.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\ContinuationQueue.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\ContinuationQueue.cs;
|
||||||
|
..\UniTask\Assets\Plugins\UniTask\Runtime\Internal\UnityWebRequestExtensions.cs;
|
||||||
|
|
||||||
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTaskSynchronizationContext.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\EnumeratorAsyncExtensions.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\EnumeratorAsyncExtensions.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs;
|
||||||
@@ -44,9 +46,7 @@
|
|||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Run.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Run.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Bridge.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.Bridge.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.WaitUntil.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UniTask.WaitUntil.cs;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.*;
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.uGUI.cs;
|
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.MonoBehaviour.cs;
|
|
||||||
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityBindingExtensions.cs;
|
..\UniTask\Assets\Plugins\UniTask\Runtime\UnityBindingExtensions.cs;
|
||||||
" />
|
" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
using Cysharp.Threading.Tasks;
|
#pragma warning disable CS1998
|
||||||
|
|
||||||
|
using Cysharp.Threading.Tasks;
|
||||||
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System;
|
using System;
|
||||||
@@ -56,6 +58,24 @@ namespace NetCoreSandbox
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Foo
|
||||||
|
{
|
||||||
|
public async UniTask MethodFooAsync()
|
||||||
|
{
|
||||||
|
await MethodBarAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async UniTask MethodBarAsync()
|
||||||
|
|
||||||
|
{
|
||||||
|
Throw();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Throw()
|
||||||
|
{
|
||||||
|
throw new Exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public struct TestAwaiter : ICriticalNotifyCompletion
|
public struct TestAwaiter : ICriticalNotifyCompletion
|
||||||
{
|
{
|
||||||
@@ -275,53 +295,25 @@ namespace NetCoreSandbox
|
|||||||
//await new ComparisonBenchmarks().ViaUniTaskT();
|
//await new ComparisonBenchmarks().ViaUniTaskT();
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
// await new AllocationCheck().ViaUniTaskVoid();
|
|
||||||
|
|
||||||
// AsyncTest().Forge
|
var e = UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
|
||||||
Console.WriteLine("A?");
|
|
||||||
var a = await new ZeroAllocAsyncAwaitInDotNetCore().NanikaAsync(1, 2);
|
|
||||||
Console.WriteLine("RET:" + a);
|
|
||||||
await WhereSelect();
|
|
||||||
|
|
||||||
SynchronizationContext.SetSynchronizationContext(new MySyncContext());
|
|
||||||
|
|
||||||
await Aaa();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//AsyncTest().Forget();
|
|
||||||
|
|
||||||
// AsyncTest().Forget();
|
|
||||||
|
|
||||||
ThreadPool.SetMinThreads(100, 100);
|
|
||||||
|
|
||||||
//List<UniTask<int>> list = new List<UniTask<int>>();
|
|
||||||
for (int i = 0; i < short.MaxValue; i++)
|
|
||||||
{
|
{
|
||||||
//// list.Add(AsyncTest());
|
for (int i = 0; i < 5; i++)
|
||||||
await YieldCore();
|
{
|
||||||
|
Console.WriteLine($"Start {i}");
|
||||||
|
await writer.YieldAsync(i);
|
||||||
|
Console.WriteLine($"End {i}");
|
||||||
}
|
}
|
||||||
//await UniTask.WhenAll(list);
|
});
|
||||||
|
|
||||||
//Console.WriteLine("TOGO");
|
var ee = e.GetAsyncEnumerator();
|
||||||
|
while (await ee.MoveNextAsync())
|
||||||
//var a = await AsyncTest();
|
{
|
||||||
//var b = AsyncTest();
|
Console.WriteLine("ForEach " + ee.Current);
|
||||||
//var c = AsyncTest();
|
}
|
||||||
await YieldCore();
|
|
||||||
|
|
||||||
//await b;
|
|
||||||
//await c;
|
|
||||||
|
|
||||||
|
|
||||||
//foreach (var item in Cysharp.Threading.Tasks.Internal.TaskPool.GetCacheSizeInfo())
|
|
||||||
//{
|
|
||||||
// Console.WriteLine(item);
|
|
||||||
//}
|
|
||||||
|
|
||||||
Console.ReadLine();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static async UniTask YieldCore()
|
static async UniTask YieldCore()
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
167
src/UniTask.NetCoreTests/AsyncLazyTest.cs
Normal file
167
src/UniTask.NetCoreTests/AsyncLazyTest.cs
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
using Cysharp.Threading.Tasks;
|
||||||
|
using FluentAssertions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Channels;
|
||||||
|
using Cysharp.Threading.Tasks.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace NetCoreTests
|
||||||
|
{
|
||||||
|
public class AsyncLazyTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task LazyLazy()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => After());
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await a;
|
||||||
|
await b;
|
||||||
|
await c;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => AfterException());
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task LazyImmediate()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => UniTask.FromResult(1).AsUniTask());
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await a;
|
||||||
|
await b;
|
||||||
|
await c;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => UniTask.FromException(new TaskTestException()));
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static async UniTask AwaitAwait(UniTask t)
|
||||||
|
{
|
||||||
|
await t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async UniTask After()
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(1));
|
||||||
|
await UniTask.Yield();
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTask AfterException()
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(1));
|
||||||
|
await UniTask.Yield();
|
||||||
|
throw new TaskTestException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AsyncLazyTest2
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task LazyLazy()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => After());
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
var a2 = await a;
|
||||||
|
var b2 = await b;
|
||||||
|
var c2 = await c;
|
||||||
|
(a2, b2, c2).Should().Be((10, 10, 10));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => AfterException());
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task LazyImmediate()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => UniTask.FromResult(1));
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
var a2 = await a;
|
||||||
|
var b2 = await b;
|
||||||
|
var c2 = await c;
|
||||||
|
(a2, b2, c2).Should().Be((1, 1, 1));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var l = UniTask.Lazy(() => UniTask.FromException<int>(new TaskTestException()));
|
||||||
|
var a = AwaitAwait(l.Task);
|
||||||
|
var b = AwaitAwait(l.Task);
|
||||||
|
var c = AwaitAwait(l.Task);
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TaskTestException>(async () => await c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static async UniTask<int> AwaitAwait(UniTask<int> t)
|
||||||
|
{
|
||||||
|
return await t;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
async UniTask<int> After()
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(1));
|
||||||
|
await UniTask.Yield();
|
||||||
|
await UniTask.Yield();
|
||||||
|
return 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTask<int> AfterException()
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
Thread.Sleep(TimeSpan.FromSeconds(1));
|
||||||
|
await UniTask.Yield();
|
||||||
|
throw new TaskTestException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -112,6 +112,85 @@ namespace NetCoreTests
|
|||||||
state.Value.Should().Be(20);
|
state.Value.Should().Be(20);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task WaitAsyncTest()
|
||||||
|
{
|
||||||
|
var rp = new AsyncReactiveProperty<int>(128);
|
||||||
|
|
||||||
|
var f = await rp.FirstAsync();
|
||||||
|
f.Should().Be(128);
|
||||||
|
|
||||||
|
{
|
||||||
|
var t = rp.WaitAsync();
|
||||||
|
rp.Value = 99;
|
||||||
|
rp.Value = 100;
|
||||||
|
var v = await t;
|
||||||
|
|
||||||
|
v.Should().Be(99);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var t = rp.WaitAsync();
|
||||||
|
rp.Value = 99;
|
||||||
|
rp.Value = 100;
|
||||||
|
var v = await t;
|
||||||
|
|
||||||
|
v.Should().Be(99);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task WaitAsyncCancellationTest()
|
||||||
|
{
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
var rp = new AsyncReactiveProperty<int>(128);
|
||||||
|
|
||||||
|
var t = rp.WaitAsync(cts.Token);
|
||||||
|
|
||||||
|
cts.Cancel();
|
||||||
|
|
||||||
|
rp.Value = 99;
|
||||||
|
rp.Value = 100;
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<OperationCanceledException>(async () => { await t; });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ReadOnlyWaitAsyncTest()
|
||||||
|
{
|
||||||
|
var rp = new AsyncReactiveProperty<int>(128);
|
||||||
|
var rrp = rp.ToReadOnlyAsyncReactiveProperty(CancellationToken.None);
|
||||||
|
|
||||||
|
var t = rrp.WaitAsync();
|
||||||
|
rp.Value = 99;
|
||||||
|
rp.Value = 100;
|
||||||
|
var v = await t;
|
||||||
|
|
||||||
|
v.Should().Be(99);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ReadOnlyWaitAsyncCancellationTest()
|
||||||
|
{
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
var rp = new AsyncReactiveProperty<int>(128);
|
||||||
|
var rrp = rp.ToReadOnlyAsyncReactiveProperty(CancellationToken.None);
|
||||||
|
|
||||||
|
var t = rrp.WaitAsync(cts.Token);
|
||||||
|
|
||||||
|
cts.Cancel();
|
||||||
|
|
||||||
|
rp.Value = 99;
|
||||||
|
rp.Value = 100;
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<OperationCanceledException>(async () => { await t; });
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
590
src/UniTask.NetCoreTests/CompletionSourceTest.cs
Normal file
590
src/UniTask.NetCoreTests/CompletionSourceTest.cs
Normal file
@@ -0,0 +1,590 @@
|
|||||||
|
using Cysharp.Threading.Tasks;
|
||||||
|
using FluentAssertions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Channels;
|
||||||
|
using Cysharp.Threading.Tasks.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace NetCoreTests
|
||||||
|
{
|
||||||
|
public class CompletionSourceTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task SetFirst()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
tcs.TrySetResult();
|
||||||
|
await tcs.Task; // ok.
|
||||||
|
await tcs.Task; // ok.
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SingleOnFirst()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetResult();
|
||||||
|
await a;
|
||||||
|
await tcs.Task; // ok.
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MultiOne()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
tcs.TrySetResult();
|
||||||
|
await a;
|
||||||
|
await b;
|
||||||
|
await tcs.Task; // ok.
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MultiTwo()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
tcs.TrySetResult();
|
||||||
|
await a;
|
||||||
|
await b;
|
||||||
|
await c;
|
||||||
|
await tcs.Task; // ok.
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await c);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await c)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource();
|
||||||
|
|
||||||
|
async UniTask Await()
|
||||||
|
{
|
||||||
|
await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await c)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestException : Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CompletionSourceTest2
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task SetFirst()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
tcs.TrySetResult(10);
|
||||||
|
var a = await tcs.Task; // ok.
|
||||||
|
var b = await tcs.Task; // ok.
|
||||||
|
a.Should().Be(10);
|
||||||
|
b.Should().Be(10);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SingleOnFirst()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetResult(10);
|
||||||
|
var r1 = await a;
|
||||||
|
var r2 = await tcs.Task; // ok.
|
||||||
|
r1.Should().Be(10);
|
||||||
|
r2.Should().Be(10);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MultiOne()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
tcs.TrySetResult(10);
|
||||||
|
var r1 = await a;
|
||||||
|
var r2 = await b;
|
||||||
|
var r3 = await tcs.Task; // ok.
|
||||||
|
(r1, r2, r3).Should().Be((10, 10, 10));
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task MultiTwo()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
tcs.TrySetResult(10);
|
||||||
|
var r1 = await a;
|
||||||
|
var r2 = await b;
|
||||||
|
var r3 = await c;
|
||||||
|
var r4 = await tcs.Task; // ok.
|
||||||
|
(r1, r2, r3, r4).Should().Be((10, 10, 10, 10));
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new TestException());
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await a);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await b);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await c);
|
||||||
|
await Assert.ThrowsAsync<TestException>(async () => await tcs.Task);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetException(new OperationCanceledException(cts.Token));
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await c)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
var tcs = new UniTaskCompletionSource<int>();
|
||||||
|
|
||||||
|
async UniTask<int> Await()
|
||||||
|
{
|
||||||
|
return await tcs.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
var a = Await();
|
||||||
|
var b = Await();
|
||||||
|
var c = Await();
|
||||||
|
|
||||||
|
tcs.TrySetCanceled(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await a)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await b)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await c)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await tcs.Task)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
tcs.Task.Status.Should().Be(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestException : Exception
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
170
src/UniTask.NetCoreTests/Linq/CreateTest.cs
Normal file
170
src/UniTask.NetCoreTests/Linq/CreateTest.cs
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
#pragma warning disable CS1998
|
||||||
|
#pragma warning disable CS0162
|
||||||
|
|
||||||
|
using Cysharp.Threading.Tasks;
|
||||||
|
using Cysharp.Threading.Tasks.Linq;
|
||||||
|
using FluentAssertions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace NetCoreTests.Linq
|
||||||
|
{
|
||||||
|
public class CreateTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task SyncCreation()
|
||||||
|
{
|
||||||
|
var from = 10;
|
||||||
|
var count = 100;
|
||||||
|
|
||||||
|
var xs = await UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
await writer.YieldAsync(from + i);
|
||||||
|
}
|
||||||
|
}).ToArrayAsync();
|
||||||
|
|
||||||
|
var ys = await Range(from, count).AsUniTaskAsyncEnumerable().ToArrayAsync();
|
||||||
|
|
||||||
|
xs.Should().BeEquivalentTo(ys);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SyncManually()
|
||||||
|
{
|
||||||
|
var list = new List<int>();
|
||||||
|
var xs = UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
list.Add(100);
|
||||||
|
await writer.YieldAsync(10);
|
||||||
|
|
||||||
|
list.Add(200);
|
||||||
|
await writer.YieldAsync(20);
|
||||||
|
|
||||||
|
list.Add(300);
|
||||||
|
await writer.YieldAsync(30);
|
||||||
|
|
||||||
|
list.Add(400);
|
||||||
|
});
|
||||||
|
|
||||||
|
list.Should().BeEmpty();
|
||||||
|
var e = xs.GetAsyncEnumerator();
|
||||||
|
|
||||||
|
list.Should().BeEmpty();
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100);
|
||||||
|
e.Current.Should().Be(10);
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100, 200);
|
||||||
|
e.Current.Should().Be(20);
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100, 200, 300);
|
||||||
|
e.Current.Should().Be(30);
|
||||||
|
|
||||||
|
(await e.MoveNextAsync()).Should().BeFalse();
|
||||||
|
list.Should().BeEquivalentTo(100, 200, 300, 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SyncExceptionFirst()
|
||||||
|
{
|
||||||
|
var from = 10;
|
||||||
|
var count = 100;
|
||||||
|
|
||||||
|
var xs = UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
throw new UniTaskTestException();
|
||||||
|
await writer.YieldAsync(from + i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<UniTaskTestException>(async () => await xs.ToArrayAsync());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SyncException()
|
||||||
|
{
|
||||||
|
var from = 10;
|
||||||
|
var count = 100;
|
||||||
|
|
||||||
|
var xs = UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
await writer.YieldAsync(from + i);
|
||||||
|
|
||||||
|
if (i == 15)
|
||||||
|
{
|
||||||
|
throw new UniTaskTestException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await Assert.ThrowsAsync<UniTaskTestException>(async () => await xs.ToArrayAsync());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task ASyncManually()
|
||||||
|
{
|
||||||
|
var list = new List<int>();
|
||||||
|
var xs = UniTaskAsyncEnumerable.Create<int>(async (writer, token) =>
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
|
||||||
|
list.Add(100);
|
||||||
|
await writer.YieldAsync(10);
|
||||||
|
|
||||||
|
await UniTask.Yield();
|
||||||
|
|
||||||
|
list.Add(200);
|
||||||
|
await writer.YieldAsync(20);
|
||||||
|
|
||||||
|
await UniTask.Yield();
|
||||||
|
list.Add(300);
|
||||||
|
await UniTask.Yield();
|
||||||
|
await writer.YieldAsync(30);
|
||||||
|
|
||||||
|
await UniTask.Yield();
|
||||||
|
|
||||||
|
list.Add(400);
|
||||||
|
});
|
||||||
|
|
||||||
|
list.Should().BeEmpty();
|
||||||
|
var e = xs.GetAsyncEnumerator();
|
||||||
|
|
||||||
|
list.Should().BeEmpty();
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100);
|
||||||
|
e.Current.Should().Be(10);
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100, 200);
|
||||||
|
e.Current.Should().Be(20);
|
||||||
|
|
||||||
|
await e.MoveNextAsync();
|
||||||
|
list.Should().BeEquivalentTo(100, 200, 300);
|
||||||
|
e.Current.Should().Be(30);
|
||||||
|
|
||||||
|
(await e.MoveNextAsync()).Should().BeFalse();
|
||||||
|
list.Should().BeEquivalentTo(100, 200, 300, 400);
|
||||||
|
}
|
||||||
|
|
||||||
|
async IAsyncEnumerable<int> Range(int from, int count)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
yield return from + i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -43,7 +43,7 @@ namespace NetCoreTests.Linq
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task TakeUntil()
|
public async Task TakeUntilCanceled()
|
||||||
{
|
{
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
@@ -72,7 +72,7 @@ namespace NetCoreTests.Linq
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task SkipUntil()
|
public async Task SkipUntilCanceled()
|
||||||
{
|
{
|
||||||
var cts = new CancellationTokenSource();
|
var cts = new CancellationTokenSource();
|
||||||
|
|
||||||
@@ -85,7 +85,7 @@ namespace NetCoreTests.Linq
|
|||||||
await c;
|
await c;
|
||||||
var foo = await xs;
|
var foo = await xs;
|
||||||
|
|
||||||
foo.Should().BeEquivalentTo(new[] { 30, 40 });
|
foo.Should().BeEquivalentTo(new[] { 20, 30, 40 });
|
||||||
|
|
||||||
async Task CancelAsync()
|
async Task CancelAsync()
|
||||||
{
|
{
|
||||||
@@ -102,5 +102,64 @@ namespace NetCoreTests.Linq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task TakeUntil()
|
||||||
|
{
|
||||||
|
var cts = new AsyncReactiveProperty<int>(0);
|
||||||
|
|
||||||
|
var rp = new AsyncReactiveProperty<int>(1);
|
||||||
|
|
||||||
|
var xs = rp.TakeUntil(cts.WaitAsync()).ToArrayAsync();
|
||||||
|
|
||||||
|
var c = CancelAsync();
|
||||||
|
|
||||||
|
await c;
|
||||||
|
var foo = await xs;
|
||||||
|
|
||||||
|
foo.Should().BeEquivalentTo(new[] { 1, 10, 20 });
|
||||||
|
|
||||||
|
async Task CancelAsync()
|
||||||
|
{
|
||||||
|
rp.Value = 10;
|
||||||
|
await Task.Yield();
|
||||||
|
rp.Value = 20;
|
||||||
|
await Task.Yield();
|
||||||
|
cts.Value = 9999;
|
||||||
|
rp.Value = 30;
|
||||||
|
await Task.Yield();
|
||||||
|
rp.Value = 40;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task SkipUntil()
|
||||||
|
{
|
||||||
|
var cts = new AsyncReactiveProperty<int>(0);
|
||||||
|
|
||||||
|
var rp = new AsyncReactiveProperty<int>(1);
|
||||||
|
|
||||||
|
var xs = rp.SkipUntil(cts.WaitAsync()).ToArrayAsync();
|
||||||
|
|
||||||
|
var c = CancelAsync();
|
||||||
|
|
||||||
|
await c;
|
||||||
|
var foo = await xs;
|
||||||
|
|
||||||
|
foo.Should().BeEquivalentTo(new[] { 20, 30, 40 });
|
||||||
|
|
||||||
|
async Task CancelAsync()
|
||||||
|
{
|
||||||
|
rp.Value = 10;
|
||||||
|
await Task.Yield();
|
||||||
|
rp.Value = 20;
|
||||||
|
await Task.Yield();
|
||||||
|
cts.Value = 9999;
|
||||||
|
rp.Value = 30;
|
||||||
|
await Task.Yield();
|
||||||
|
rp.Value = 40;
|
||||||
|
|
||||||
|
rp.Dispose(); // complete.
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
40
src/UniTask.NetCoreTests/WithCancellationTest.cs
Normal file
40
src/UniTask.NetCoreTests/WithCancellationTest.cs
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
using Cysharp.Threading.Tasks;
|
||||||
|
using FluentAssertions;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace NetCoreTests
|
||||||
|
{
|
||||||
|
public class WithCancellationTest
|
||||||
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task Standard()
|
||||||
|
{
|
||||||
|
CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
var v = await UniTask.Run(() => 10).WithCancellation(cts.Token);
|
||||||
|
|
||||||
|
v.Should().Be(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public async Task Cancel()
|
||||||
|
{
|
||||||
|
CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
var t = UniTask.Create(async () =>
|
||||||
|
{
|
||||||
|
await Task.Delay(TimeSpan.FromSeconds(1));
|
||||||
|
return 10;
|
||||||
|
}).WithCancellation(cts.Token);
|
||||||
|
|
||||||
|
cts.Cancel();
|
||||||
|
|
||||||
|
(await Assert.ThrowsAsync<OperationCanceledException>(async () => await t)).CancellationToken.Should().Be(cts.Token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
734
src/UniTask/Assembly-CSharp-firstpass.csproj
Normal file
734
src/UniTask/Assembly-CSharp-firstpass.csproj
Normal file
@@ -0,0 +1,734 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<LangVersion>latest</LangVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>10.0.20506</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<RootNamespace></RootNamespace>
|
||||||
|
<ProjectGuid>{CECB0124-DA37-D676-2B9E-00C5241684F4}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<AssemblyName>Assembly-CSharp-firstpass</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<BaseDirectory>.</BaseDirectory>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>Temp\Bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE;UNITY_2020_2_1;UNITY_2020_2;UNITY_2020;UNITY_5_3_OR_NEWER;UNITY_5_4_OR_NEWER;UNITY_5_5_OR_NEWER;UNITY_5_6_OR_NEWER;UNITY_2017_1_OR_NEWER;UNITY_2017_2_OR_NEWER;UNITY_2017_3_OR_NEWER;UNITY_2017_4_OR_NEWER;UNITY_2018_1_OR_NEWER;UNITY_2018_2_OR_NEWER;UNITY_2018_3_OR_NEWER;UNITY_2018_4_OR_NEWER;UNITY_2019_1_OR_NEWER;UNITY_2019_2_OR_NEWER;UNITY_2019_3_OR_NEWER;UNITY_2019_4_OR_NEWER;UNITY_2020_1_OR_NEWER;UNITY_2020_2_OR_NEWER;PLATFORM_ARCH_64;UNITY_64;UNITY_INCLUDE_TESTS;USE_SEARCH_ENGINE_API;SCENE_TEMPLATE_MODULE;ENABLE_AR;ENABLE_AUDIO;ENABLE_CACHING;ENABLE_CLOTH;ENABLE_EVENT_QUEUE;ENABLE_MICROPHONE;ENABLE_MULTIPLE_DISPLAYS;ENABLE_PHYSICS;ENABLE_TEXTURE_STREAMING;ENABLE_VIRTUALTEXTURING;ENABLE_UNET;ENABLE_LZMA;ENABLE_UNITYEVENTS;ENABLE_VR;ENABLE_WEBCAM;ENABLE_UNITYWEBREQUEST;ENABLE_WWW;ENABLE_CLOUD_SERVICES;ENABLE_CLOUD_SERVICES_COLLAB;ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS;ENABLE_CLOUD_SERVICES_ADS;ENABLE_CLOUD_SERVICES_USE_WEBREQUEST;ENABLE_CLOUD_SERVICES_CRASH_REPORTING;ENABLE_CLOUD_SERVICES_PURCHASING;ENABLE_CLOUD_SERVICES_ANALYTICS;ENABLE_CLOUD_SERVICES_UNET;ENABLE_CLOUD_SERVICES_BUILD;ENABLE_CLOUD_LICENSE;ENABLE_EDITOR_HUB_LICENSE;ENABLE_WEBSOCKET_CLIENT;ENABLE_DIRECTOR_AUDIO;ENABLE_DIRECTOR_TEXTURE;ENABLE_MANAGED_JOBS;ENABLE_MANAGED_TRANSFORM_JOBS;ENABLE_MANAGED_ANIMATION_JOBS;ENABLE_MANAGED_AUDIO_JOBS;INCLUDE_DYNAMIC_GI;ENABLE_MONO_BDWGC;ENABLE_SCRIPTING_GC_WBARRIERS;PLATFORM_SUPPORTS_MONO;RENDER_SOFTWARE_CURSOR;ENABLE_VIDEO;PLATFORM_STANDALONE;PLATFORM_STANDALONE_WIN;UNITY_STANDALONE_WIN;UNITY_STANDALONE;ENABLE_RUNTIME_GI;ENABLE_MOVIES;ENABLE_NETWORK;ENABLE_CRUNCH_TEXTURE_COMPRESSION;ENABLE_OUT_OF_PROCESS_CRASH_HANDLER;ENABLE_CLUSTER_SYNC;ENABLE_CLUSTERINPUT;PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP;GFXDEVICE_WAITFOREVENT_MESSAGEPUMP;ENABLE_WEBSOCKET_HOST;ENABLE_MONO;NET_STANDARD_2_0;ENABLE_PROFILER;UNITY_ASSERTIONS;UNITY_EDITOR;UNITY_EDITOR_64;UNITY_EDITOR_WIN;ENABLE_UNITY_COLLECTIONS_CHECKS;ENABLE_BURST_AOT;UNITY_TEAM_LICENSE;UNITY_PRO_LICENSE;ENABLE_CUSTOM_RENDER_TEXTURE;ENABLE_DIRECTOR;ENABLE_LOCALIZATION;ENABLE_SPRITES;ENABLE_TERRAIN;ENABLE_TILEMAP;ENABLE_TIMELINE;ENABLE_LEGACY_INPUT_MANAGER;CSHARP_7_OR_LATER;CSHARP_7_3_OR_NEWER</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<NoWarn>0169</NoWarn>
|
||||||
|
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>Temp\bin\Release\</OutputPath>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<NoWarn>0169</NoWarn>
|
||||||
|
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<NoConfig>true</NoConfig>
|
||||||
|
<NoStdLib>true</NoStdLib>
|
||||||
|
<AddAdditionalExplicitAssemblyReferences>false</AddAdditionalExplicitAssemblyReferences>
|
||||||
|
<ImplicitlyExpandNETStandardFacades>false</ImplicitlyExpandNETStandardFacades>
|
||||||
|
<ImplicitlyExpandDesignTimeFacades>false</ImplicitlyExpandDesignTimeFacades>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<ProjectTypeGuids>{E097FAD1-6243-4DAD-9C02-E9B9EFC3FFC1};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<UnityProjectGenerator>Package</UnityProjectGenerator>
|
||||||
|
<UnityProjectGeneratorVersion>2.0.5</UnityProjectGeneratorVersion>
|
||||||
|
<UnityProjectType>GamePlugins:3</UnityProjectType>
|
||||||
|
<UnityBuildTarget>StandaloneWindows64:19</UnityBuildTarget>
|
||||||
|
<UnityVersion>2020.2.1f1</UnityVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Analyzer Include="C:\Program Files (x86)\Microsoft Visual Studio Tools for Unity\16.0\Analyzers\Microsoft.Unity.Analyzers.dll" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CompilerServices\AsyncUniTaskMethodBuilder.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.Bridge.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\EnumerableAsyncExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\Error.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Channel.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\IUniTaskSource.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Progress.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\PooledDelegate.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WhenAny.Generated.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.uGUI.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.MonoBehaviour.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskCompletionSource.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\DiagnosticsExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CompilerServices\AsyncMethodBuilderAttribute.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\AsyncAwakeTrigger.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CompilerServices\AsyncUniTaskVoidMethodBuilder.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\IUniTaskAsyncEnumerable.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CancellationTokenSourceExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\_InternalVisibleTo.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\AsyncUnit.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\RuntimeHelpersAbstraction.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\TriggerEvent.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.Threading.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskVoid.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\TaskPool.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityBindingExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\AsyncTriggerBase.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityWebRequestException.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\WeakDictionary.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskSynchronizationContext.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\ArrayPool.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\AsyncStartTrigger.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskExtensions.Shorthand.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.Delay.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskScheduler.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WhenAll.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.Factory.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\ValueStopwatch.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\ContinuationQueue.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\EnumeratorAsyncExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.AssetBundleRequestAllAssets.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\PlayerLoopRunner.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WaitUntil.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.Run.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\ArrayUtil.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\MoveNextSource.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\MonoBehaviourMessagesTriggers.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\ExceptionExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\AsyncReactiveProperty.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\AsyncLazy.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WhenAny.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\PlayerLoopHelper.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\MinimumQueue.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTask.WhenAll.Generated.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CompilerServices\StateMachineRunner.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\StatePool.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.AsyncGPUReadback.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UnityAsyncExtensions.Jobs.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskObservableExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\UniTaskExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\AsyncTriggerExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CancellationTokenExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\ArrayPoolUtil.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\TaskTracker.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Triggers\AsyncDestroyTrigger.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\UnityEqualityComparer.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\Internal\UnityWebRequestExtensions.cs" />
|
||||||
|
<Compile Include="Assets\Plugins\UniTask\Runtime\CancellationTokenEqualityComparer.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="Assets\Plugins\UniTask\Runtime\UniTask.asmdef" />
|
||||||
|
<Reference Include="UnityEngine">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ARModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ARModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AccessibilityModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AccessibilityModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AndroidJNIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AndroidJNIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AnimationModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AnimationModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AssetBundleModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AssetBundleModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.AudioModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.AudioModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ClusterInputModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterInputModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ClusterRendererModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ClusterRendererModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CoreModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.CrashReportingModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.CrashReportingModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.DSPGraphModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.DSPGraphModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.DirectorModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.DirectorModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.GIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.GIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.GameCenterModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.GameCenterModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.GridModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.GridModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.HotReloadModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.HotReloadModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.IMGUIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.IMGUIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ImageConversionModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ImageConversionModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.InputModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.InputModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.InputLegacyModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.InputLegacyModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.JSONSerializeModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.JSONSerializeModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.LocalizationModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.LocalizationModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ParticleSystemModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ParticleSystemModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.PerformanceReportingModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.PerformanceReportingModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ProfilerModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ProfilerModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.ScreenCaptureModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.ScreenCaptureModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.SharedInternalsModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.SharedInternalsModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.SpriteMaskModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteMaskModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.SpriteShapeModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.SpriteShapeModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.StreamingModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.StreamingModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.SubstanceModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.SubstanceModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TLSModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.TLSModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TerrainModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.TerrainModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TextCoreModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextCoreModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.TextRenderingModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.TextRenderingModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UIElementsModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UIElementsModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UIElementsNativeModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UIElementsNativeModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UNETModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UNETModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UmbraModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UmbraModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityAnalyticsModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityAnalyticsModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityConnectModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityConnectModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityCurlModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityCurlModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityTestProtocolModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityTestProtocolModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestAssetBundleModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestAudioModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestAudioModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestTextureModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestTextureModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.UnityWebRequestWWWModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.UnityWebRequestWWWModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.VFXModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.VFXModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.VideoModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.VideoModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.VirtualTexturingModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.VirtualTexturingModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEngine.WindModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEngine.WindModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.CoreModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.CoreModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.GraphViewModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.GraphViewModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.PackageManagerUIModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.PackageManagerUIModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.SceneTemplateModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.SceneTemplateModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.UIElementsModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.UIElementsSamplesModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIElementsSamplesModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.UIServiceModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.UIServiceModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.UnityConnectModule">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\Managed\UnityEngine\UnityEditor.UnityConnectModule.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="nunit.framework">
|
||||||
|
<HintPath>Library\PackageCache\com.unity.ext.nunit@1.0.5\net35\unity-custom\nunit.framework.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="netstandard">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\ref\2.0.0\netstandard.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Win32.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\Microsoft.Win32.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.AppContext">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.AppContext.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections.Concurrent">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Collections.Concurrent.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Collections.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections.NonGeneric">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Collections.NonGeneric.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Collections.Specialized">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Collections.Specialized.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ComponentModel">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ComponentModel.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ComponentModel.EventBasedAsync">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ComponentModel.EventBasedAsync.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ComponentModel.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ComponentModel.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ComponentModel.TypeConverter">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ComponentModel.TypeConverter.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Console">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Console.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Data.Common">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Data.Common.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.Contracts">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.Contracts.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.Debug">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.Debug.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.FileVersionInfo">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.FileVersionInfo.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.Process">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.Process.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.StackTrace">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.StackTrace.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.TextWriterTraceListener">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.TextWriterTraceListener.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.Tools">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.Tools.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.TraceSource">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.TraceSource.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Diagnostics.Tracing">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Diagnostics.Tracing.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Drawing.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Drawing.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Dynamic.Runtime">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Dynamic.Runtime.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Globalization.Calendars">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Globalization.Calendars.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Globalization">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Globalization.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Globalization.Extensions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Globalization.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.Compression">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.Compression.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.Compression.ZipFile">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.Compression.ZipFile.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.FileSystem">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.FileSystem.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.FileSystem.DriveInfo">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.FileSystem.DriveInfo.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.FileSystem.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.FileSystem.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.FileSystem.Watcher">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.FileSystem.Watcher.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.IsolatedStorage">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.IsolatedStorage.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.MemoryMappedFiles">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.MemoryMappedFiles.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.Pipes">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.Pipes.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.UnmanagedMemoryStream">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.IO.UnmanagedMemoryStream.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Linq">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Linq.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Linq.Expressions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Linq.Expressions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Linq.Parallel">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Linq.Parallel.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Linq.Queryable">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Linq.Queryable.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Http">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Http.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.NameResolution">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.NameResolution.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.NetworkInformation">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.NetworkInformation.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Ping">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Ping.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Requests">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Requests.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Security">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Security.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.Sockets">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.Sockets.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.WebHeaderCollection">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.WebHeaderCollection.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.WebSockets.Client">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.WebSockets.Client.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net.WebSockets">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Net.WebSockets.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ObjectModel">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ObjectModel.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Reflection">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Reflection.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Reflection.Extensions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Reflection.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Reflection.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Reflection.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Resources.Reader">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Resources.Reader.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Resources.ResourceManager">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Resources.ResourceManager.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Resources.Writer">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Resources.Writer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.CompilerServices.VisualC">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.CompilerServices.VisualC.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Extensions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Handles">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Handles.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.InteropServices">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.InteropServices.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.InteropServices.RuntimeInformation">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Numerics">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Numerics.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization.Formatters">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Serialization.Formatters.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization.Json">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Serialization.Json.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Serialization.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization.Xml">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Runtime.Serialization.Xml.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Claims">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Claims.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Cryptography.Algorithms">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Cryptography.Algorithms.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Cryptography.Csp">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Cryptography.Csp.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Cryptography.Encoding">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Cryptography.Encoding.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Cryptography.Primitives">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Cryptography.Primitives.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Cryptography.X509Certificates">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Cryptography.X509Certificates.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.Principal">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.Principal.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Security.SecureString">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Security.SecureString.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Encoding">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Text.Encoding.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.Encoding.Extensions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Text.Encoding.Extensions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Text.RegularExpressions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Text.RegularExpressions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Overlapped">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.Overlapped.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.Tasks.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Tasks.Parallel">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.Tasks.Parallel.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Thread">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.Thread.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.ThreadPool">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.ThreadPool.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Threading.Timer">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Threading.Timer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ValueTuple">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.ValueTuple.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.ReaderWriter">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.ReaderWriter.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.XDocument">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.XDocument.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.XmlDocument">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.XmlDocument.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.XmlSerializer">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.XmlSerializer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.XPath">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.XPath.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.XPath.XDocument">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netstandard\System.Xml.XPath.XDocument.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics.Vectors">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\Extensions\2.0.0\System.Numerics.Vectors.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.InteropServices.WindowsRuntime">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\Extensions\2.0.0\System.Runtime.InteropServices.WindowsRuntime.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="mscorlib">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\mscorlib.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ComponentModel.Composition">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.ComponentModel.Composition.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Core">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Core.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Data">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Data.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Drawing">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Drawing.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.IO.Compression.FileSystem">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.IO.Compression.FileSystem.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Net">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Net.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Numerics">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Numerics.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Runtime.Serialization">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Runtime.Serialization.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.ServiceModel.Web">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.ServiceModel.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Transactions">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Transactions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Web">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Web.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Windows">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Windows.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Xml.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.Linq">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Xml.Linq.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Xml.Serialization">
|
||||||
|
<HintPath>C:\Program Files\Unity\Hub\Editor\2020.2.1f1\Editor\Data\NetStandard\compat\2.0.0\shims\netfx\System.Xml.Serialization.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.VSCode.Editor">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.VSCode.Editor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="UnityEditor.CacheServer">
|
||||||
|
<HintPath>Library\ScriptAssemblies\UnityEditor.CacheServer.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.VisualStudio.Editor">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.VisualStudio.Editor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.Addressables">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.Addressables.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.ScriptableBuildPipeline">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.ScriptableBuildPipeline.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.Addressables.Editor">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.Addressables.Editor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.ScriptableBuildPipeline.Editor">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.ScriptableBuildPipeline.Editor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.ResourceManager">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.ResourceManager.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Unity.Rider.Editor">
|
||||||
|
<HintPath>Library\ScriptAssemblies\Unity.Rider.Editor.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="UniTask.TextMeshPro.csproj">
|
||||||
|
<Project>{B5929667-6CB2-8779-D894-4F69110C1A43}</Project>
|
||||||
|
<Name>UniTask.TextMeshPro</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="TempAsm.csproj">
|
||||||
|
<Project>{9E0EF10C-B6E1-E08E-3160-7162D66F7EE0}</Project>
|
||||||
|
<Name>TempAsm</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="UniTask.DOTween.csproj">
|
||||||
|
<Project>{7121D833-D063-D143-CFFC-CD50DDF1B3D1}</Project>
|
||||||
|
<Name>UniTask.DOTween</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="UniTask.Addressables.csproj">
|
||||||
|
<Project>{78124C71-0355-1FB9-3AEB-7D573CD8E7CA}</Project>
|
||||||
|
<Name>UniTask.Addressables</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="UniTask.Linq.csproj">
|
||||||
|
<Project>{7F0F67EA-D985-C15F-AAE8-F643789B52A7}</Project>
|
||||||
|
<Name>UniTask.Linq</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<Target Name="GenerateTargetFrameworkMonikerAttribute" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
@@ -20,8 +20,9 @@ public static class EditorRunnerChecker
|
|||||||
{
|
{
|
||||||
Debug.Log("Start");
|
Debug.Log("Start");
|
||||||
|
|
||||||
var r = await UnityWebRequest.Get("https://bing.com/").SendWebRequest().ToUniTask();
|
//var r = await UnityWebRequest.Get("https://bing.com/").SendWebRequest().ToUniTask();
|
||||||
Debug.Log(r.downloadHandler.text.Substring(0, 100));
|
//Debug.Log(r.downloadHandler.text.Substring(0, 100));
|
||||||
|
await UniTask.Yield();
|
||||||
|
|
||||||
Debug.Log("End");
|
Debug.Log("End");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"allowUnsafeCode": false,
|
"allowUnsafeCode": false,
|
||||||
"overrideReferences": false,
|
"overrideReferences": false,
|
||||||
"precompiledReferences": [],
|
"precompiledReferences": [],
|
||||||
"autoReferenced": true,
|
"autoReferenced": false,
|
||||||
"defineConstraints": [],
|
"defineConstraints": [],
|
||||||
"versionDefines": [],
|
"versionDefines": [],
|
||||||
"noEngineReferences": false
|
"noEngineReferences": false
|
||||||
|
|||||||
@@ -7,113 +7,239 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
public class AsyncLazy
|
public class AsyncLazy
|
||||||
{
|
{
|
||||||
Func<UniTask> valueFactory;
|
static Action<object> continuation = SetCompletionSource;
|
||||||
UniTask target;
|
|
||||||
|
Func<UniTask> taskFactory;
|
||||||
|
UniTaskCompletionSource completionSource;
|
||||||
|
UniTask.Awaiter awaiter;
|
||||||
|
|
||||||
object syncLock;
|
object syncLock;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
|
||||||
public AsyncLazy(Func<UniTask> valueFactory)
|
public AsyncLazy(Func<UniTask> taskFactory)
|
||||||
{
|
{
|
||||||
this.valueFactory = valueFactory;
|
this.taskFactory = taskFactory;
|
||||||
this.target = default;
|
this.completionSource = new UniTaskCompletionSource();
|
||||||
this.syncLock = new object();
|
this.syncLock = new object();
|
||||||
this.initialized = false;
|
this.initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal AsyncLazy(UniTask value)
|
internal AsyncLazy(UniTask task)
|
||||||
{
|
{
|
||||||
this.valueFactory = null;
|
this.taskFactory = null;
|
||||||
this.target = value;
|
this.completionSource = new UniTaskCompletionSource();
|
||||||
this.syncLock = null;
|
this.syncLock = null;
|
||||||
this.initialized = true;
|
this.initialized = true;
|
||||||
|
|
||||||
|
var awaiter = task.GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
SetCompletionSource(awaiter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.awaiter = awaiter;
|
||||||
|
awaiter.SourceOnCompleted(continuation, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UniTask Task => EnsureInitialized();
|
public UniTask Task
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
EnsureInitialized();
|
||||||
|
return completionSource.Task;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UniTask.Awaiter GetAwaiter() => EnsureInitialized().GetAwaiter();
|
|
||||||
|
|
||||||
UniTask EnsureInitialized()
|
public UniTask.Awaiter GetAwaiter() => Task.GetAwaiter();
|
||||||
|
|
||||||
|
void EnsureInitialized()
|
||||||
{
|
{
|
||||||
if (Volatile.Read(ref initialized))
|
if (Volatile.Read(ref initialized))
|
||||||
{
|
{
|
||||||
return target;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EnsureInitializedCore();
|
EnsureInitializedCore();
|
||||||
}
|
}
|
||||||
|
|
||||||
UniTask EnsureInitializedCore()
|
void EnsureInitializedCore()
|
||||||
{
|
{
|
||||||
lock (syncLock)
|
lock (syncLock)
|
||||||
{
|
{
|
||||||
if (!Volatile.Read(ref initialized))
|
if (!Volatile.Read(ref initialized))
|
||||||
{
|
{
|
||||||
var f = Interlocked.Exchange(ref valueFactory, null);
|
var f = Interlocked.Exchange(ref taskFactory, null);
|
||||||
if (f != null)
|
if (f != null)
|
||||||
{
|
{
|
||||||
target = f().Preserve(); // with preserve(allow multiple await).
|
var task = f();
|
||||||
|
var awaiter = task.GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
SetCompletionSource(awaiter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.awaiter = awaiter;
|
||||||
|
awaiter.SourceOnCompleted(continuation, this);
|
||||||
|
}
|
||||||
|
|
||||||
Volatile.Write(ref initialized, true);
|
Volatile.Write(ref initialized, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return target;
|
void SetCompletionSource(in UniTask.Awaiter awaiter)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
awaiter.GetResult();
|
||||||
|
completionSource.TrySetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetCompletionSource(object state)
|
||||||
|
{
|
||||||
|
var self = (AsyncLazy)state;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
self.awaiter.GetResult();
|
||||||
|
self.completionSource.TrySetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
self.awaiter = default;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class AsyncLazy<T>
|
public class AsyncLazy<T>
|
||||||
{
|
{
|
||||||
Func<UniTask<T>> valueFactory;
|
static Action<object> continuation = SetCompletionSource;
|
||||||
UniTask<T> target;
|
|
||||||
|
Func<UniTask<T>> taskFactory;
|
||||||
|
UniTaskCompletionSource<T> completionSource;
|
||||||
|
UniTask<T>.Awaiter awaiter;
|
||||||
|
|
||||||
object syncLock;
|
object syncLock;
|
||||||
bool initialized;
|
bool initialized;
|
||||||
|
|
||||||
public AsyncLazy(Func<UniTask<T>> valueFactory)
|
public AsyncLazy(Func<UniTask<T>> taskFactory)
|
||||||
{
|
{
|
||||||
this.valueFactory = valueFactory;
|
this.taskFactory = taskFactory;
|
||||||
this.target = default;
|
this.completionSource = new UniTaskCompletionSource<T>();
|
||||||
this.syncLock = new object();
|
this.syncLock = new object();
|
||||||
this.initialized = false;
|
this.initialized = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal AsyncLazy(UniTask<T> value)
|
internal AsyncLazy(UniTask<T> task)
|
||||||
{
|
{
|
||||||
this.valueFactory = null;
|
this.taskFactory = null;
|
||||||
this.target = value;
|
this.completionSource = new UniTaskCompletionSource<T>();
|
||||||
this.syncLock = null;
|
this.syncLock = null;
|
||||||
this.initialized = true;
|
this.initialized = true;
|
||||||
|
|
||||||
|
var awaiter = task.GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
SetCompletionSource(awaiter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.awaiter = awaiter;
|
||||||
|
awaiter.SourceOnCompleted(continuation, this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UniTask<T> Task => EnsureInitialized();
|
public UniTask<T> Task
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
EnsureInitialized();
|
||||||
|
return completionSource.Task;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UniTask<T>.Awaiter GetAwaiter() => EnsureInitialized().GetAwaiter();
|
|
||||||
|
|
||||||
UniTask<T> EnsureInitialized()
|
public UniTask<T>.Awaiter GetAwaiter() => Task.GetAwaiter();
|
||||||
|
|
||||||
|
void EnsureInitialized()
|
||||||
{
|
{
|
||||||
if (Volatile.Read(ref initialized))
|
if (Volatile.Read(ref initialized))
|
||||||
{
|
{
|
||||||
return target;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EnsureInitializedCore();
|
EnsureInitializedCore();
|
||||||
}
|
}
|
||||||
|
|
||||||
UniTask<T> EnsureInitializedCore()
|
void EnsureInitializedCore()
|
||||||
{
|
{
|
||||||
lock (syncLock)
|
lock (syncLock)
|
||||||
{
|
{
|
||||||
if (!Volatile.Read(ref initialized))
|
if (!Volatile.Read(ref initialized))
|
||||||
{
|
{
|
||||||
var f = Interlocked.Exchange(ref valueFactory, null);
|
var f = Interlocked.Exchange(ref taskFactory, null);
|
||||||
if (f != null)
|
if (f != null)
|
||||||
{
|
{
|
||||||
target = f().Preserve(); // with preserve(allow multiple await).
|
var task = f();
|
||||||
|
var awaiter = task.GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
SetCompletionSource(awaiter);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.awaiter = awaiter;
|
||||||
|
awaiter.SourceOnCompleted(continuation, this);
|
||||||
|
}
|
||||||
|
|
||||||
Volatile.Write(ref initialized, true);
|
Volatile.Write(ref initialized, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return target;
|
void SetCompletionSource(in UniTask<T>.Awaiter awaiter)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = awaiter.GetResult();
|
||||||
|
completionSource.TrySetResult(result);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void SetCompletionSource(object state)
|
||||||
|
{
|
||||||
|
var self = (AsyncLazy<T>)state;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = self.awaiter.GetResult();
|
||||||
|
self.completionSource.TrySetResult(result);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
self.awaiter = default;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
T Value { get; }
|
T Value { get; }
|
||||||
IUniTaskAsyncEnumerable<T> WithoutCurrent();
|
IUniTaskAsyncEnumerable<T> WithoutCurrent();
|
||||||
|
UniTask<T> WaitAsync(CancellationToken cancellationToken = default);
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IAsyncReactiveProperty<T> : IReadOnlyAsyncReactiveProperty<T>
|
public interface IAsyncReactiveProperty<T> : IReadOnlyAsyncReactiveProperty<T>
|
||||||
@@ -69,6 +70,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return latestValue?.ToString();
|
return latestValue?.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UniTask<T> WaitAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return new UniTask<T>(WaitAsyncSource.Create(this, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
static bool isValueType;
|
static bool isValueType;
|
||||||
|
|
||||||
static AsyncReactiveProperty()
|
static AsyncReactiveProperty()
|
||||||
@@ -76,7 +82,136 @@ namespace Cysharp.Threading.Tasks
|
|||||||
isValueType = typeof(T).IsValueType;
|
isValueType = typeof(T).IsValueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T>
|
sealed class WaitAsyncSource : IUniTaskSource<T>, ITriggerHandler<T>, ITaskPoolNode<WaitAsyncSource>
|
||||||
|
{
|
||||||
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
|
static TaskPool<WaitAsyncSource> pool;
|
||||||
|
WaitAsyncSource nextNode;
|
||||||
|
ref WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static WaitAsyncSource()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(WaitAsyncSource), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncReactiveProperty<T> parent;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration;
|
||||||
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
|
WaitAsyncSource()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource<T> Create(AsyncReactiveProperty<T> parent, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource<T>.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new WaitAsyncSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.parent = parent;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
if (cancellationToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.parent.triggerEvent.Add(result);
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
cancellationTokenRegistration.Dispose();
|
||||||
|
cancellationTokenRegistration = default;
|
||||||
|
parent.triggerEvent.Remove(this);
|
||||||
|
parent = null;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CancellationCallback(object state)
|
||||||
|
{
|
||||||
|
var self = (WaitAsyncSource)state;
|
||||||
|
self.OnCanceled(self.cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
// IUniTaskSource
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ITriggerHandler
|
||||||
|
|
||||||
|
ITriggerHandler<T> ITriggerHandler<T>.Prev { get; set; }
|
||||||
|
ITriggerHandler<T> ITriggerHandler<T>.Next { get; set; }
|
||||||
|
|
||||||
|
public void OnCanceled(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted()
|
||||||
|
{
|
||||||
|
// Complete as Cancel.
|
||||||
|
core.TrySetCanceled(CancellationToken.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnError(Exception ex)
|
||||||
|
{
|
||||||
|
core.TrySetException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNext(T value)
|
||||||
|
{
|
||||||
|
core.TrySetResult(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T>
|
||||||
{
|
{
|
||||||
readonly AsyncReactiveProperty<T> parent;
|
readonly AsyncReactiveProperty<T> parent;
|
||||||
|
|
||||||
@@ -253,6 +388,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return latestValue?.ToString();
|
return latestValue?.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UniTask<T> WaitAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return new UniTask<T>(WaitAsyncSource.Create(this, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
static bool isValueType;
|
static bool isValueType;
|
||||||
|
|
||||||
static ReadOnlyAsyncReactiveProperty()
|
static ReadOnlyAsyncReactiveProperty()
|
||||||
@@ -260,7 +400,136 @@ namespace Cysharp.Threading.Tasks
|
|||||||
isValueType = typeof(T).IsValueType;
|
isValueType = typeof(T).IsValueType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T>
|
sealed class WaitAsyncSource : IUniTaskSource<T>, ITriggerHandler<T>, ITaskPoolNode<WaitAsyncSource>
|
||||||
|
{
|
||||||
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
|
static TaskPool<WaitAsyncSource> pool;
|
||||||
|
WaitAsyncSource nextNode;
|
||||||
|
ref WaitAsyncSource ITaskPoolNode<WaitAsyncSource>.NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static WaitAsyncSource()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(WaitAsyncSource), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
ReadOnlyAsyncReactiveProperty<T> parent;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration;
|
||||||
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
|
WaitAsyncSource()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource<T> Create(ReadOnlyAsyncReactiveProperty<T> parent, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource<T>.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new WaitAsyncSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.parent = parent;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
if (cancellationToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
result.cancellationTokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.parent.triggerEvent.Add(result);
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
cancellationTokenRegistration.Dispose();
|
||||||
|
cancellationTokenRegistration = default;
|
||||||
|
parent.triggerEvent.Remove(this);
|
||||||
|
parent = null;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CancellationCallback(object state)
|
||||||
|
{
|
||||||
|
var self = (WaitAsyncSource)state;
|
||||||
|
self.OnCanceled(self.cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
// IUniTaskSource
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ITriggerHandler
|
||||||
|
|
||||||
|
ITriggerHandler<T> ITriggerHandler<T>.Prev { get; set; }
|
||||||
|
ITriggerHandler<T> ITriggerHandler<T>.Next { get; set; }
|
||||||
|
|
||||||
|
public void OnCanceled(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted()
|
||||||
|
{
|
||||||
|
// Complete as Cancel.
|
||||||
|
core.TrySetCanceled(CancellationToken.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnError(Exception ex)
|
||||||
|
{
|
||||||
|
core.TrySetException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNext(T value)
|
||||||
|
{
|
||||||
|
core.TrySetResult(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class WithoutCurrentEnumerable : IUniTaskAsyncEnumerable<T>
|
||||||
{
|
{
|
||||||
readonly ReadOnlyAsyncReactiveProperty<T> parent;
|
readonly ReadOnlyAsyncReactiveProperty<T> parent;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,56 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static class CancellationTokenExtensions
|
public static class CancellationTokenExtensions
|
||||||
{
|
{
|
||||||
static readonly Action<object> cancellationTokenCallback = Callback;
|
static readonly Action<object> cancellationTokenCallback = Callback;
|
||||||
|
static readonly Action<object> disposeCallback = DisposeCallback;
|
||||||
|
|
||||||
|
public static CancellationToken ToCancellationToken(this UniTask task)
|
||||||
|
{
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
ToCancellationTokenCore(task, cts).Forget();
|
||||||
|
return cts.Token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CancellationToken ToCancellationToken(this UniTask task, CancellationToken linkToken)
|
||||||
|
{
|
||||||
|
if (linkToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return linkToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!linkToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
return ToCancellationToken(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = CancellationTokenSource.CreateLinkedTokenSource(linkToken);
|
||||||
|
ToCancellationTokenCore(task, cts).Forget();
|
||||||
|
|
||||||
|
return cts.Token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CancellationToken ToCancellationToken<T>(this UniTask<T> task)
|
||||||
|
{
|
||||||
|
return ToCancellationToken(task.AsUniTask());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CancellationToken ToCancellationToken<T>(this UniTask<T> task, CancellationToken linkToken)
|
||||||
|
{
|
||||||
|
return ToCancellationToken(task.AsUniTask(), linkToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
static async UniTaskVoid ToCancellationTokenCore(UniTask task, CancellationTokenSource cts)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await task;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
cts.Cancel();
|
||||||
|
cts.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public static (UniTask, CancellationTokenRegistration) ToUniTask(this CancellationToken cancellationToken)
|
public static (UniTask, CancellationTokenRegistration) ToUniTask(this CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@@ -75,6 +125,17 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static CancellationTokenRegistration AddTo(this IDisposable disposable, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return cancellationToken.RegisterWithoutCaptureExecutionContext(disposeCallback, disposable);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DisposeCallback(object state)
|
||||||
|
{
|
||||||
|
var d = (IDisposable)state;
|
||||||
|
d.Dispose();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct CancellationTokenAwaitable
|
public struct CancellationTokenAwaitable
|
||||||
|
|||||||
@@ -9,15 +9,15 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
public static class CancellationTokenSourceExtensions
|
public static class CancellationTokenSourceExtensions
|
||||||
{
|
{
|
||||||
public static void CancelAfterSlim(this CancellationTokenSource cts, int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update)
|
public static void CancelAfterSlim(this CancellationTokenSource cts, int millisecondsDelay, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update)
|
||||||
{
|
{
|
||||||
var delay = UniTask.Delay(millisecondsDelay, ignoreTimeScale, delayTiming, cts.Token);
|
var delay = UniTask.Delay(millisecondsDelay, delayType, delayTiming, cts.Token);
|
||||||
CancelAfterCore(cts, delay).Forget();
|
CancelAfterCore(cts, delay).Forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void CancelAfterSlim(this CancellationTokenSource cts, TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update)
|
public static void CancelAfterSlim(this CancellationTokenSource cts, TimeSpan delayTimeSpan, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update)
|
||||||
{
|
{
|
||||||
var delay = UniTask.Delay(delayTimeSpan, ignoreTimeScale, delayTiming, cts.Token);
|
var delay = UniTask.Delay(delayTimeSpan, delayType, delayTiming, cts.Token);
|
||||||
CancelAfterCore(cts, delay).Forget();
|
CancelAfterCore(cts, delay).Forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,12 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
// runner is finished, return first.
|
// runner is finished, return first.
|
||||||
if (runner != null)
|
if (runner != null)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
// workaround for IL2CPP bug.
|
||||||
|
PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, runner.ReturnAction);
|
||||||
|
#else
|
||||||
runner.Return();
|
runner.Return();
|
||||||
|
#endif
|
||||||
runner = null;
|
runner = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +61,12 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
// runner is finished, return.
|
// runner is finished, return.
|
||||||
if (runner != null)
|
if (runner != null)
|
||||||
{
|
{
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
// workaround for IL2CPP bug.
|
||||||
|
PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, runner.ReturnAction);
|
||||||
|
#else
|
||||||
runner.Return();
|
runner.Return();
|
||||||
|
#endif
|
||||||
runner = null;
|
runner = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
using Cysharp.Threading.Tasks.Internal;
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
using System;
|
using System;
|
||||||
@@ -8,10 +8,18 @@ using System.Runtime.CompilerServices;
|
|||||||
|
|
||||||
namespace Cysharp.Threading.Tasks.CompilerServices
|
namespace Cysharp.Threading.Tasks.CompilerServices
|
||||||
{
|
{
|
||||||
|
// #ENABLE_IL2CPP in this file is to avoid bug of IL2CPP VM.
|
||||||
|
// Issue is tracked on https://issuetracker.unity3d.com/issues/il2cpp-incorrect-results-when-calling-a-method-from-outside-class-in-a-struct
|
||||||
|
// but currently it is labeled `Won't Fix`.
|
||||||
|
|
||||||
internal interface IStateMachineRunner
|
internal interface IStateMachineRunner
|
||||||
{
|
{
|
||||||
Action MoveNext { get; }
|
Action MoveNext { get; }
|
||||||
void Return();
|
void Return();
|
||||||
|
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
Action ReturnAction { get; }
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
internal interface IStateMachineRunnerPromise : IUniTaskSource
|
internal interface IStateMachineRunnerPromise : IUniTaskSource
|
||||||
@@ -32,6 +40,7 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
|
|
||||||
internal static class StateMachineUtility
|
internal static class StateMachineUtility
|
||||||
{
|
{
|
||||||
|
// Get AsyncStateMachine internal state to check IL2CPP bug
|
||||||
public static int GetState(IAsyncStateMachine stateMachine)
|
public static int GetState(IAsyncStateMachine stateMachine)
|
||||||
{
|
{
|
||||||
var info = stateMachine.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
|
var info = stateMachine.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
|
||||||
@@ -45,13 +54,20 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
{
|
{
|
||||||
static TaskPool<AsyncUniTaskVoid<TStateMachine>> pool;
|
static TaskPool<AsyncUniTaskVoid<TStateMachine>> pool;
|
||||||
|
|
||||||
IAsyncStateMachine stateMachine; // unfortunatelly boxed to fix IL2CPP issue.
|
#if ENABLE_IL2CPP
|
||||||
|
public Action ReturnAction { get; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TStateMachine stateMachine;
|
||||||
|
|
||||||
public Action MoveNext { get; }
|
public Action MoveNext { get; }
|
||||||
|
|
||||||
public AsyncUniTaskVoid()
|
public AsyncUniTaskVoid()
|
||||||
{
|
{
|
||||||
MoveNext = Run;
|
MoveNext = Run;
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
ReturnAction = Return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunner runnerFieldRef)
|
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunner runnerFieldRef)
|
||||||
@@ -71,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()
|
||||||
{
|
{
|
||||||
@@ -113,15 +130,20 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
{
|
{
|
||||||
static TaskPool<AsyncUniTask<TStateMachine>> pool;
|
static TaskPool<AsyncUniTask<TStateMachine>> pool;
|
||||||
|
|
||||||
IAsyncStateMachine stateMachine; // unfortunatelly boxed to fix IL2CPP issue.
|
#if ENABLE_IL2CPP
|
||||||
|
readonly Action returnDelegate;
|
||||||
|
#endif
|
||||||
public Action MoveNext { get; }
|
public Action MoveNext { get; }
|
||||||
|
|
||||||
|
TStateMachine stateMachine;
|
||||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
AsyncUniTask()
|
AsyncUniTask()
|
||||||
{
|
{
|
||||||
MoveNext = Run;
|
MoveNext = Run;
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
returnDelegate = Return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise runnerPromiseFieldRef)
|
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise runnerPromiseFieldRef)
|
||||||
@@ -136,13 +158,22 @@ 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()
|
||||||
{
|
{
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncUniTask<TStateMachine>), () => pool.Size);
|
TaskPool.RegisterSizeGetter(typeof(AsyncUniTask<TStateMachine>), () => pool.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Return()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
stateMachine = default;
|
||||||
|
pool.TryPush(this);
|
||||||
|
}
|
||||||
|
|
||||||
bool TryReturn()
|
bool TryReturn()
|
||||||
{
|
{
|
||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
@@ -188,7 +219,12 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
// workaround for IL2CPP bug.
|
||||||
|
PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, returnDelegate);
|
||||||
|
#else
|
||||||
TryReturn();
|
TryReturn();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,14 +245,6 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncUniTask()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal sealed class AsyncUniTask<TStateMachine, T> : IStateMachineRunnerPromise<T>, IUniTaskSource<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>
|
internal sealed class AsyncUniTask<TStateMachine, T> : IStateMachineRunnerPromise<T>, IUniTaskSource<T>, ITaskPoolNode<AsyncUniTask<TStateMachine, T>>
|
||||||
@@ -224,15 +252,21 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
{
|
{
|
||||||
static TaskPool<AsyncUniTask<TStateMachine, T>> pool;
|
static TaskPool<AsyncUniTask<TStateMachine, T>> pool;
|
||||||
|
|
||||||
IAsyncStateMachine stateMachine; // unfortunatelly boxed to fix IL2CPP issue.
|
#if ENABLE_IL2CPP
|
||||||
|
readonly Action returnDelegate;
|
||||||
|
#endif
|
||||||
|
|
||||||
public Action MoveNext { get; }
|
public Action MoveNext { get; }
|
||||||
|
|
||||||
|
TStateMachine stateMachine;
|
||||||
UniTaskCompletionSourceCore<T> core;
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
AsyncUniTask()
|
AsyncUniTask()
|
||||||
{
|
{
|
||||||
MoveNext = Run;
|
MoveNext = Run;
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
returnDelegate = Return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise<T> runnerPromiseFieldRef)
|
public static void SetStateMachine(ref TStateMachine stateMachine, ref IStateMachineRunnerPromise<T> runnerPromiseFieldRef)
|
||||||
@@ -245,18 +279,24 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
|
|
||||||
runnerPromiseFieldRef = result; // set runner before copied.
|
runnerPromiseFieldRef = result; // set runner before copied.
|
||||||
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
result.stateMachine = stateMachine; // copy struct StateMachine(in release build).
|
||||||
|
|
||||||
// UnityEngine.Debug.Log($"SetStateMachine State:" + StateMachineUtility.GetState(stateMachine));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AsyncUniTask<TStateMachine, T> nextNode;
|
||||||
public AsyncUniTask<TStateMachine, T> NextNode { get; set; }
|
public ref AsyncUniTask<TStateMachine, T> NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncUniTask()
|
static AsyncUniTask()
|
||||||
{
|
{
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncUniTask<TStateMachine, T>), () => pool.Size);
|
TaskPool.RegisterSizeGetter(typeof(AsyncUniTask<TStateMachine, T>), () => pool.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Return()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
stateMachine = default;
|
||||||
|
pool.TryPush(this);
|
||||||
|
}
|
||||||
|
|
||||||
bool TryReturn()
|
bool TryReturn()
|
||||||
{
|
{
|
||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
@@ -303,7 +343,12 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
#if ENABLE_IL2CPP
|
||||||
|
// workaround for IL2CPP bug.
|
||||||
|
PlayerLoopHelper.AddContinuation(PlayerLoopTiming.LastPostLateUpdate, returnDelegate);
|
||||||
|
#else
|
||||||
TryReturn();
|
TryReturn();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -330,14 +375,6 @@ namespace Cysharp.Threading.Tasks.CompilerServices
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncUniTask()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
@@ -44,6 +58,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
IEnumerator innerEnumerator;
|
IEnumerator innerEnumerator;
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
|
int initialFrame;
|
||||||
|
bool loopRunning;
|
||||||
|
bool calledGetResult;
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<object> core;
|
UniTaskCompletionSourceCore<object> core;
|
||||||
|
|
||||||
@@ -66,10 +83,18 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
result.innerEnumerator = ConsumeEnumerator(innerEnumerator);
|
result.innerEnumerator = ConsumeEnumerator(innerEnumerator);
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
result.loopRunning = true;
|
||||||
PlayerLoopHelper.AddAction(timing, result);
|
result.calledGetResult = false;
|
||||||
|
result.initialFrame = -1;
|
||||||
|
|
||||||
token = result.core.Version;
|
token = result.core.Version;
|
||||||
|
|
||||||
|
// run immediately.
|
||||||
|
if (result.MoveNext())
|
||||||
|
{
|
||||||
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,13 +102,17 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
calledGetResult = true;
|
||||||
core.GetResult(token);
|
core.GetResult(token);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
|
{
|
||||||
|
if (!loopRunning)
|
||||||
{
|
{
|
||||||
TryReturn();
|
TryReturn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UniTaskStatus GetStatus(short token)
|
public UniTaskStatus GetStatus(short token)
|
||||||
{
|
{
|
||||||
@@ -102,12 +131,38 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (initialFrame == -1)
|
||||||
|
{
|
||||||
|
// Time can not touch in threadpool.
|
||||||
|
if (PlayerLoopHelper.IsMainThread)
|
||||||
|
{
|
||||||
|
initialFrame = Time.frameCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (initialFrame == Time.frameCount)
|
||||||
|
{
|
||||||
|
return true; // already executed in first frame, skip.
|
||||||
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (innerEnumerator.MoveNext())
|
if (innerEnumerator.MoveNext())
|
||||||
@@ -117,10 +172,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;
|
||||||
}
|
}
|
||||||
@@ -131,15 +188,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
core.Reset();
|
core.Reset();
|
||||||
innerEnumerator = default;
|
innerEnumerator = default;
|
||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~EnumeratorPromise()
|
return pool.TryPush(this);
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unwrap YieldInstructions
|
// Unwrap YieldInstructions
|
||||||
@@ -153,11 +203,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;
|
||||||
}
|
}
|
||||||
@@ -183,7 +232,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
yield return null;
|
goto WARN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (current is IEnumerator e3)
|
else if (current is IEnumerator e3)
|
||||||
@@ -196,17 +245,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// WaitForEndOfFrame, WaitForFixedUpdate, others.
|
goto WARN;
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// WWW and others as CustomYieldInstruction.
|
continue;
|
||||||
static IEnumerator UnwrapWaitCustomYieldInstruction(CustomYieldInstruction yieldInstruction)
|
|
||||||
{
|
WARN:
|
||||||
while (yieldInstruction.keepWaiting)
|
// 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.");
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -216,12 +262,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
static IEnumerator UnwrapWaitForSeconds(WaitForSeconds waitForSeconds)
|
static IEnumerator UnwrapWaitForSeconds(WaitForSeconds waitForSeconds)
|
||||||
{
|
{
|
||||||
var second = (float)waitForSeconds_Seconds.GetValue(waitForSeconds);
|
var second = (float)waitForSeconds_Seconds.GetValue(waitForSeconds);
|
||||||
var startTime = DateTimeOffset.UtcNow;
|
var elapsed = 0.0f;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
yield return null;
|
yield return null;
|
||||||
|
|
||||||
var elapsed = (DateTimeOffset.UtcNow - startTime).TotalSeconds;
|
elapsed += Time.deltaTime;
|
||||||
if (elapsed >= second)
|
if (elapsed >= second)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
@@ -239,4 +285,3 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables.meta
vendored
Normal file
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables.meta
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a5b9231662e24c942b544bd85d4b39cb
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -11,24 +11,39 @@ using UnityEngine.ResourceManagement.AsyncOperations;
|
|||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
{
|
{
|
||||||
public static class AddressableAsyncExtensions
|
public static class AddressablesAsyncExtensions
|
||||||
{
|
{
|
||||||
#region AsyncOperationHandle
|
#region AsyncOperationHandle
|
||||||
|
|
||||||
public static AsyncOperationHandleAwaiter GetAwaiter(this AsyncOperationHandle handle)
|
public static UniTask.Awaiter GetAwaiter(this AsyncOperationHandle handle)
|
||||||
{
|
{
|
||||||
return new AsyncOperationHandleAwaiter(handle);
|
return ToUniTask(handle).GetAwaiter();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken)
|
public static UniTask WithCancellation(this AsyncOperationHandle handle, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (handle.IsDone) return UniTask.CompletedTask;
|
return ToUniTask(handle, cancellationToken: cancellationToken);
|
||||||
return new UniTask(AsyncOperationHandleWithCancellationSource.Create(handle, cancellationToken, out var token), token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
if (handle.IsDone) return UniTask.CompletedTask;
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken);
|
||||||
|
|
||||||
|
if (!handle.IsValid())
|
||||||
|
{
|
||||||
|
// autoReleaseHandle:true handle is invalid(immediately internal handle == null) so return completed.
|
||||||
|
return UniTask.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (handle.IsDone)
|
||||||
|
{
|
||||||
|
if (handle.Status == AsyncOperationStatus.Failed)
|
||||||
|
{
|
||||||
|
return UniTask.FromException(handle.OperationException);
|
||||||
|
}
|
||||||
|
return UniTask.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, out var token), token);
|
return new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,29 +92,31 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class AsyncOperationHandleWithCancellationSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleWithCancellationSource>
|
sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource>
|
||||||
{
|
{
|
||||||
static TaskPool<AsyncOperationHandleWithCancellationSource> pool;
|
static TaskPool<AsyncOperationHandleConfiguredSource> pool;
|
||||||
public AsyncOperationHandleWithCancellationSource NextNode { get; set; }
|
AsyncOperationHandleConfiguredSource nextNode;
|
||||||
|
public ref AsyncOperationHandleConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
static AsyncOperationHandleWithCancellationSource()
|
static AsyncOperationHandleConfiguredSource()
|
||||||
{
|
{
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleWithCancellationSource), () => pool.Size);
|
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
readonly Action<AsyncOperationHandle> continuationAction;
|
readonly Action<AsyncOperationHandle> continuationAction;
|
||||||
AsyncOperationHandle handle;
|
AsyncOperationHandle handle;
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
|
IProgress<float> progress;
|
||||||
bool completed;
|
bool completed;
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
AsyncOperationHandleWithCancellationSource()
|
AsyncOperationHandleConfiguredSource()
|
||||||
{
|
{
|
||||||
continuationAction = Continuation;
|
continuationAction = Continuation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IUniTaskSource Create(AsyncOperationHandle handle, CancellationToken cancellationToken, out short token)
|
public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, out short token)
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
@@ -108,16 +125,17 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
if (!pool.TryPop(out var result))
|
if (!pool.TryPop(out var result))
|
||||||
{
|
{
|
||||||
result = new AsyncOperationHandleWithCancellationSource();
|
result = new AsyncOperationHandleConfiguredSource();
|
||||||
}
|
}
|
||||||
|
|
||||||
result.handle = handle;
|
result.handle = handle;
|
||||||
|
result.progress = progress;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
result.completed = false;
|
result.completed = false;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, result);
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
|
||||||
handle.Completed += result.continuationAction;
|
handle.Completed += result.continuationAction;
|
||||||
|
|
||||||
@@ -136,7 +154,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
if (handle.Status == AsyncOperationStatus.Failed)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
}
|
||||||
|
else if (handle.Status == AsyncOperationStatus.Failed)
|
||||||
{
|
{
|
||||||
core.TrySetException(handle.OperationException);
|
core.TrySetException(handle.OperationException);
|
||||||
}
|
}
|
||||||
@@ -182,6 +204,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (progress != null && handle.IsValid())
|
||||||
|
{
|
||||||
|
progress.Report(handle.PercentComplete);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -190,357 +217,69 @@ namespace Cysharp.Threading.Tasks
|
|||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
core.Reset();
|
core.Reset();
|
||||||
handle = default;
|
handle = default;
|
||||||
|
progress = default;
|
||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncOperationHandleWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class AsyncOperationHandleConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleConfiguredSource>
|
#endregion
|
||||||
{
|
|
||||||
static TaskPool<AsyncOperationHandleConfiguredSource> pool;
|
|
||||||
public AsyncOperationHandleConfiguredSource NextNode { get; set; }
|
|
||||||
|
|
||||||
static AsyncOperationHandleConfiguredSource()
|
#region AsyncOperationHandle_T
|
||||||
|
|
||||||
|
public static UniTask<T>.Awaiter GetAwaiter<T>(this AsyncOperationHandle<T> handle)
|
||||||
{
|
{
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource), () => pool.Size);
|
return ToUniTask(handle).GetAwaiter();
|
||||||
}
|
}
|
||||||
|
|
||||||
AsyncOperationHandle handle;
|
public static UniTask<T> WithCancellation<T>(this AsyncOperationHandle<T> handle, CancellationToken cancellationToken)
|
||||||
IProgress<float> progress;
|
|
||||||
CancellationToken cancellationToken;
|
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
|
||||||
|
|
||||||
AsyncOperationHandleConfiguredSource()
|
|
||||||
{
|
{
|
||||||
|
return ToUniTask(handle, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IUniTaskSource Create(AsyncOperationHandle handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, out short token)
|
public static UniTask<T> ToUniTask<T>(this AsyncOperationHandle<T> handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<T>(cancellationToken);
|
||||||
|
|
||||||
|
if (!handle.IsValid())
|
||||||
{
|
{
|
||||||
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
|
throw new Exception("Attempting to use an invalid operation handle");
|
||||||
}
|
|
||||||
|
|
||||||
if (!pool.TryPop(out var result))
|
|
||||||
{
|
|
||||||
result = new AsyncOperationHandleConfiguredSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.handle = handle;
|
|
||||||
result.progress = progress;
|
|
||||||
result.cancellationToken = cancellationToken;
|
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
|
||||||
|
|
||||||
PlayerLoopHelper.AddAction(timing, result);
|
|
||||||
|
|
||||||
token = result.core.Version;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void GetResult(short token)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
|
|
||||||
core.GetResult(token);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
TryReturn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public UniTaskStatus GetStatus(short token)
|
|
||||||
{
|
|
||||||
return core.GetStatus(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UniTaskStatus UnsafeGetStatus()
|
|
||||||
{
|
|
||||||
return core.UnsafeGetStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
||||||
{
|
|
||||||
core.OnCompleted(continuation, state, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool MoveNext()
|
|
||||||
{
|
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
core.TrySetCanceled(cancellationToken);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (progress != null)
|
|
||||||
{
|
|
||||||
progress.Report(handle.PercentComplete);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handle.IsDone)
|
if (handle.IsDone)
|
||||||
{
|
{
|
||||||
if (handle.Status == AsyncOperationStatus.Failed)
|
if (handle.Status == AsyncOperationStatus.Failed)
|
||||||
{
|
{
|
||||||
core.TrySetException(handle.OperationException);
|
return UniTask.FromException<T>(handle.OperationException);
|
||||||
}
|
}
|
||||||
else
|
return UniTask.FromResult(handle.Result);
|
||||||
{
|
|
||||||
core.TrySetResult(AsyncUnit.Default);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TryReturn()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
TaskTracker.RemoveTracking(this);
|
|
||||||
handle = default;
|
|
||||||
progress = default;
|
|
||||||
cancellationToken = default;
|
|
||||||
return pool.TryPush(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~AsyncOperationHandleConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region AsyncOperationHandle_T
|
|
||||||
|
|
||||||
public static AsyncOperationHandleAwaiter<T> GetAwaiter<T>(this AsyncOperationHandle<T> handle)
|
|
||||||
{
|
|
||||||
return new AsyncOperationHandleAwaiter<T>(handle);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UniTask<T> WithCancellation<T>(this AsyncOperationHandle<T> handle, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
if (handle.IsDone) return UniTask.FromResult(handle.Result);
|
|
||||||
return new UniTask<T>(AsyncOperationHandleWithCancellationSource<T>.Create(handle, cancellationToken, out var token), token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static UniTask<T> ToUniTask<T>(this AsyncOperationHandle<T> handle, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
|
||||||
{
|
|
||||||
if (handle.IsDone) return UniTask.FromResult(handle.Result);
|
|
||||||
return new UniTask<T>(AsyncOperationHandleConfiguredSource<T>.Create(handle, timing, progress, cancellationToken, out var token), token);
|
return new UniTask<T>(AsyncOperationHandleConfiguredSource<T>.Create(handle, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct AsyncOperationHandleAwaiter<T> : ICriticalNotifyCompletion
|
|
||||||
{
|
|
||||||
AsyncOperationHandle<T> handle;
|
|
||||||
Action<AsyncOperationHandle> continuationAction;
|
|
||||||
|
|
||||||
public AsyncOperationHandleAwaiter(AsyncOperationHandle<T> handle)
|
|
||||||
{
|
|
||||||
this.handle = handle;
|
|
||||||
this.continuationAction = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsCompleted => handle.IsDone;
|
|
||||||
|
|
||||||
public T GetResult()
|
|
||||||
{
|
|
||||||
if (continuationAction != null)
|
|
||||||
{
|
|
||||||
handle.CompletedTypeless -= continuationAction;
|
|
||||||
continuationAction = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle.Status == AsyncOperationStatus.Failed)
|
|
||||||
{
|
|
||||||
var e = handle.OperationException;
|
|
||||||
handle = default;
|
|
||||||
ExceptionDispatchInfo.Capture(e).Throw();
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = handle.Result;
|
|
||||||
handle = default;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnCompleted(Action continuation)
|
|
||||||
{
|
|
||||||
UnsafeOnCompleted(continuation);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UnsafeOnCompleted(Action continuation)
|
|
||||||
{
|
|
||||||
Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction);
|
|
||||||
continuationAction = PooledDelegate<AsyncOperationHandle>.Create(continuation);
|
|
||||||
handle.CompletedTypeless += continuationAction;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sealed class AsyncOperationHandleWithCancellationSource<T> : IUniTaskSource<T>, IPlayerLoopItem, ITaskPoolNode<AsyncOperationHandleWithCancellationSource<T>>
|
|
||||||
{
|
|
||||||
static TaskPool<AsyncOperationHandleWithCancellationSource<T>> pool;
|
|
||||||
public AsyncOperationHandleWithCancellationSource<T> NextNode { get; set; }
|
|
||||||
|
|
||||||
static AsyncOperationHandleWithCancellationSource()
|
|
||||||
{
|
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleWithCancellationSource<T>), () => pool.Size);
|
|
||||||
}
|
|
||||||
|
|
||||||
readonly Action<AsyncOperationHandle<T>> continuationAction;
|
|
||||||
AsyncOperationHandle<T> handle;
|
|
||||||
CancellationToken cancellationToken;
|
|
||||||
bool completed;
|
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<T> core;
|
|
||||||
|
|
||||||
AsyncOperationHandleWithCancellationSource()
|
|
||||||
{
|
|
||||||
continuationAction = Continuation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, CancellationToken cancellationToken, out short token)
|
|
||||||
{
|
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
return AutoResetUniTaskCompletionSource<T>.CreateFromCanceled(cancellationToken, out token);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!pool.TryPop(out var result))
|
|
||||||
{
|
|
||||||
result = new AsyncOperationHandleWithCancellationSource<T>();
|
|
||||||
}
|
|
||||||
|
|
||||||
result.handle = handle;
|
|
||||||
result.cancellationToken = cancellationToken;
|
|
||||||
result.completed = false;
|
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
|
||||||
|
|
||||||
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, result);
|
|
||||||
|
|
||||||
handle.Completed += result.continuationAction;
|
|
||||||
|
|
||||||
token = result.core.Version;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Continuation(AsyncOperationHandle<T> _)
|
|
||||||
{
|
|
||||||
handle.Completed -= continuationAction;
|
|
||||||
|
|
||||||
if (completed)
|
|
||||||
{
|
|
||||||
TryReturn();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
completed = true;
|
|
||||||
if (handle.Status == AsyncOperationStatus.Failed)
|
|
||||||
{
|
|
||||||
core.TrySetException(handle.OperationException);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
core.TrySetResult(handle.Result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public T GetResult(short token)
|
|
||||||
{
|
|
||||||
return core.GetResult(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IUniTaskSource.GetResult(short token)
|
|
||||||
{
|
|
||||||
GetResult(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UniTaskStatus GetStatus(short token)
|
|
||||||
{
|
|
||||||
return core.GetStatus(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UniTaskStatus UnsafeGetStatus()
|
|
||||||
{
|
|
||||||
return core.UnsafeGetStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
||||||
{
|
|
||||||
core.OnCompleted(continuation, state, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool MoveNext()
|
|
||||||
{
|
|
||||||
if (completed)
|
|
||||||
{
|
|
||||||
TryReturn();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cancellationToken.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
completed = true;
|
|
||||||
core.TrySetCanceled(cancellationToken);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool TryReturn()
|
|
||||||
{
|
|
||||||
TaskTracker.RemoveTracking(this);
|
|
||||||
core.Reset();
|
|
||||||
handle = default;
|
|
||||||
cancellationToken = default;
|
|
||||||
return pool.TryPush(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
~AsyncOperationHandleWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource<T>), () => pool.Size);
|
TaskPool.RegisterSizeGetter(typeof(AsyncOperationHandleConfiguredSource<T>), () => pool.Size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readonly Action<AsyncOperationHandle<T>> continuationAction;
|
||||||
AsyncOperationHandle<T> handle;
|
AsyncOperationHandle<T> handle;
|
||||||
IProgress<float> progress;
|
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
|
IProgress<float> progress;
|
||||||
|
bool completed;
|
||||||
|
|
||||||
UniTaskCompletionSourceCore<T> core;
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
AsyncOperationHandleConfiguredSource()
|
AsyncOperationHandleConfiguredSource()
|
||||||
{
|
{
|
||||||
|
continuationAction = Continuation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, out short token)
|
public static IUniTaskSource<T> Create(AsyncOperationHandle<T> handle, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, out short token)
|
||||||
@@ -556,27 +295,49 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
result.handle = handle;
|
result.handle = handle;
|
||||||
result.progress = progress;
|
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
result.completed = false;
|
||||||
|
result.progress = progress;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
PlayerLoopHelper.AddAction(timing, result);
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
|
||||||
|
handle.Completed += result.continuationAction;
|
||||||
|
|
||||||
token = result.core.Version;
|
token = result.core.Version;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public T GetResult(short token)
|
void Continuation(AsyncOperationHandle<T> argHandle)
|
||||||
{
|
{
|
||||||
try
|
handle.Completed -= continuationAction;
|
||||||
{
|
|
||||||
return core.GetResult(token);
|
if (completed)
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
{
|
||||||
TryReturn();
|
TryReturn();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
}
|
||||||
|
else if (argHandle.Status == AsyncOperationStatus.Failed)
|
||||||
|
{
|
||||||
|
core.TrySetException(argHandle.OperationException);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
core.TrySetResult(argHandle.Result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IUniTaskSource.GetResult(short token)
|
void IUniTaskSource.GetResult(short token)
|
||||||
@@ -601,30 +362,24 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
|
if (completed)
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
|
completed = true;
|
||||||
core.TrySetCanceled(cancellationToken);
|
core.TrySetCanceled(cancellationToken);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progress != null)
|
if (progress != null && handle.IsValid())
|
||||||
{
|
{
|
||||||
progress.Report(handle.PercentComplete);
|
progress.Report(handle.PercentComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handle.IsDone)
|
|
||||||
{
|
|
||||||
if (handle.Status == AsyncOperationStatus.Failed)
|
|
||||||
{
|
|
||||||
core.TrySetException(handle.OperationException);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
core.TrySetResult(handle.Result);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -637,17 +392,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncOperationHandleConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef
vendored
Normal file
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/Addressables/UniTask.Addressables.asmdef
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "UniTask.Addressables",
|
||||||
|
"references": [
|
||||||
|
"UniTask",
|
||||||
|
"Unity.ResourceManager"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [
|
||||||
|
{
|
||||||
|
"name": "com.unity.addressables",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_ADDRESSABLE_SUPPORT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 593a5b492d29ac6448b1ebf7f035ef33
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween.meta
vendored
Normal file
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween.meta
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 25cb2f742bfeb1d48a4e65d3140b955d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -11,7 +11,6 @@ using System.Threading;
|
|||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
{
|
{
|
||||||
// The idea of TweenCancelBehaviour is borrowed from https://www.shibuya24.info/entry/dotween_async_await
|
|
||||||
public enum TweenCancelBehaviour
|
public enum TweenCancelBehaviour
|
||||||
{
|
{
|
||||||
Kill,
|
Kill,
|
||||||
@@ -29,6 +28,16 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public static class DOTweenAsyncExtensions
|
public static class DOTweenAsyncExtensions
|
||||||
{
|
{
|
||||||
|
enum CallbackType
|
||||||
|
{
|
||||||
|
Kill,
|
||||||
|
Complete,
|
||||||
|
Pause,
|
||||||
|
Play,
|
||||||
|
Rewind,
|
||||||
|
StepComplete
|
||||||
|
}
|
||||||
|
|
||||||
public static TweenAwaiter GetAwaiter(this Tween tween)
|
public static TweenAwaiter GetAwaiter(this Tween tween)
|
||||||
{
|
{
|
||||||
return new TweenAwaiter(tween);
|
return new TweenAwaiter(tween);
|
||||||
@@ -39,7 +48,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
Error.ThrowArgumentNullException(tween, nameof(tween));
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
if (!tween.IsActive()) return UniTask.CompletedTask;
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
return new UniTask(TweenConfiguredSource.Create(tween, TweenCancelBehaviour.Kill, cancellationToken, out var token), token);
|
return new UniTask(TweenConfiguredSource.Create(tween, TweenCancelBehaviour.Kill, cancellationToken, CallbackType.Kill, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask ToUniTask(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
public static UniTask ToUniTask(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
@@ -47,7 +56,47 @@ namespace Cysharp.Threading.Tasks
|
|||||||
Error.ThrowArgumentNullException(tween, nameof(tween));
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
if (!tween.IsActive()) return UniTask.CompletedTask;
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, out var token), token);
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Kill, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask AwaitForComplete(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Complete, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask AwaitForPause(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Pause, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask AwaitForPlay(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Play, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask AwaitForRewind(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.Rewind, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask AwaitForStepComplete(this Tween tween, TweenCancelBehaviour tweenCancelBehaviour = TweenCancelBehaviour.Kill, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(tween, nameof(tween));
|
||||||
|
|
||||||
|
if (!tween.IsActive()) return UniTask.CompletedTask;
|
||||||
|
return new UniTask(TweenConfiguredSource.Create(tween, tweenCancelBehaviour, cancellationToken, CallbackType.StepComplete, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct TweenAwaiter : ICriticalNotifyCompletion
|
public struct TweenAwaiter : ICriticalNotifyCompletion
|
||||||
@@ -86,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()
|
||||||
{
|
{
|
||||||
@@ -95,12 +145,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
static readonly TweenCallback EmptyTweenCallback = () => { };
|
static readonly TweenCallback EmptyTweenCallback = () => { };
|
||||||
|
|
||||||
readonly TweenCallback onKillDelegate;
|
readonly TweenCallback onCompleteCallbackDelegate;
|
||||||
readonly TweenCallback onUpdateDelegate;
|
readonly TweenCallback onUpdateDelegate;
|
||||||
|
|
||||||
Tween tween;
|
Tween tween;
|
||||||
TweenCancelBehaviour cancelBehaviour;
|
TweenCancelBehaviour cancelBehaviour;
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
|
CallbackType callbackType;
|
||||||
bool canceled;
|
bool canceled;
|
||||||
|
|
||||||
TweenCallback originalUpdateAction;
|
TweenCallback originalUpdateAction;
|
||||||
@@ -108,11 +159,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
TweenConfiguredSource()
|
TweenConfiguredSource()
|
||||||
{
|
{
|
||||||
onKillDelegate = OnKill;
|
onCompleteCallbackDelegate = OnCompleteCallbackDelegate;
|
||||||
onUpdateDelegate = OnUpdate;
|
onUpdateDelegate = OnUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, out short token)
|
public static IUniTaskSource Create(Tween tween, TweenCancelBehaviour cancelBehaviour, CancellationToken cancellationToken, CallbackType callbackType, out short token)
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
@@ -128,6 +179,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
result.tween = tween;
|
result.tween = tween;
|
||||||
result.cancelBehaviour = cancelBehaviour;
|
result.cancelBehaviour = cancelBehaviour;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
result.callbackType = callbackType;
|
||||||
|
|
||||||
result.originalUpdateAction = tween.onUpdate;
|
result.originalUpdateAction = tween.onUpdate;
|
||||||
result.canceled = false;
|
result.canceled = false;
|
||||||
@@ -138,7 +190,30 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
tween.onUpdate = result.onUpdateDelegate;
|
tween.onUpdate = result.onUpdateDelegate;
|
||||||
tween.onKill = result.onKillDelegate;
|
|
||||||
|
switch (callbackType)
|
||||||
|
{
|
||||||
|
case CallbackType.Kill:
|
||||||
|
tween.onKill = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
case CallbackType.Complete:
|
||||||
|
tween.onComplete = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
case CallbackType.Pause:
|
||||||
|
tween.onPause = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
case CallbackType.Play:
|
||||||
|
tween.onPlay = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
case CallbackType.Rewind:
|
||||||
|
tween.onRewind = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
case CallbackType.StepComplete:
|
||||||
|
tween.onStepComplete = result.onCompleteCallbackDelegate;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
@@ -146,8 +221,19 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnKill()
|
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);
|
||||||
@@ -199,7 +285,31 @@ namespace Cysharp.Threading.Tasks
|
|||||||
this.tween.Complete(true);
|
this.tween.Complete(true);
|
||||||
break;
|
break;
|
||||||
case TweenCancelBehaviour.CancelAwait:
|
case TweenCancelBehaviour.CancelAwait:
|
||||||
this.tween.onKill = EmptyTweenCallback; // replace to empty(avoid callback after Canceled(instance is returned to pool.)
|
// replace to empty(avoid callback after Canceled(instance is returned to pool.)
|
||||||
|
switch (callbackType)
|
||||||
|
{
|
||||||
|
case CallbackType.Kill:
|
||||||
|
tween.onKill = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
case CallbackType.Complete:
|
||||||
|
tween.onComplete = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
case CallbackType.Pause:
|
||||||
|
tween.onPause = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
case CallbackType.Play:
|
||||||
|
tween.onPlay = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
case CallbackType.Rewind:
|
||||||
|
tween.onRewind = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
case CallbackType.StepComplete:
|
||||||
|
tween.onStepComplete = EmptyTweenCallback;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
this.core.TrySetCanceled(this.cancellationToken);
|
this.core.TrySetCanceled(this.cancellationToken);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -272,20 +382,36 @@ namespace Cysharp.Threading.Tasks
|
|||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
core.Reset();
|
core.Reset();
|
||||||
tween.onUpdate = originalUpdateAction;
|
tween.onUpdate = originalUpdateAction;
|
||||||
|
|
||||||
|
switch (callbackType)
|
||||||
|
{
|
||||||
|
case CallbackType.Kill:
|
||||||
tween.onKill = null;
|
tween.onKill = null;
|
||||||
|
break;
|
||||||
|
case CallbackType.Complete:
|
||||||
|
tween.onComplete = null;
|
||||||
|
break;
|
||||||
|
case CallbackType.Pause:
|
||||||
|
tween.onPause = null;
|
||||||
|
break;
|
||||||
|
case CallbackType.Play:
|
||||||
|
tween.onPlay = null;
|
||||||
|
break;
|
||||||
|
case CallbackType.Rewind:
|
||||||
|
tween.onRewind = null;
|
||||||
|
break;
|
||||||
|
case CallbackType.StepComplete:
|
||||||
|
tween.onStepComplete = null;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
tween = default;
|
tween = default;
|
||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
originalUpdateAction = default;
|
originalUpdateAction = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~TweenConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef
vendored
Normal file
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "UniTask.DOTween",
|
||||||
|
"references": [
|
||||||
|
"UniTask",
|
||||||
|
"DOTween.Modules"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [
|
||||||
|
{
|
||||||
|
"name": "com.demigiant.dotween",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_DOTWEEN_SUPPORT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
7
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta
vendored
Normal file
7
src/UniTask/Assets/Plugins/UniTask/Runtime/External/DOTween/UniTask.DOTween.asmdef.meta
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 029c1c1b674aaae47a6841a0b89ad80e
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro.meta
vendored
Normal file
8
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro.meta
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f89da606bde9a4e4e94ae1189a029887
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,224 @@
|
|||||||
|
#if UNITASK_TEXTMESHPRO_SUPPORT
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static partial class TextMeshProAsyncExtensions
|
||||||
|
{
|
||||||
|
public static IAsyncValueChangedEventHandler<string> GetAsyncValueChangedEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncValueChangedEventHandler<string> GetAsyncValueChangedEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onValueChanged, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnValueChangedAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnValueChangedAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onValueChanged, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnValueChangedAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onValueChanged, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnValueChangedAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onValueChanged, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncEndEditEventHandler<string> GetAsyncEndEditEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncEndEditEventHandler<string> GetAsyncEndEditEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onEndEdit, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnEndEditAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnEndEditAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onEndEdit, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnEndEditAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onEndEdit, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnEndEditAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onEndEdit, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncEndTextSelectionEventHandler<(string, int, int)> GetAsyncEndTextSelectionEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncEndTextSelectionEventHandler<(string, int, int)> GetAsyncEndTextSelectionEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<(string, int, int)> OnEndTextSelectionAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<(string, int, int)> OnEndTextSelectionAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<(string, int, int)> OnEndTextSelectionAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<(string, int, int)> OnEndTextSelectionAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onEndTextSelection), cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncTextSelectionEventHandler<(string, int, int)> GetAsyncTextSelectionEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncTextSelectionEventHandler<(string, int, int)> GetAsyncTextSelectionEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<(string, int, int)> OnTextSelectionAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<(string, int, int)> OnTextSelectionAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<(string, int, int)> OnTextSelectionAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<(string, int, int)> OnTextSelectionAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<(string, int, int)>(new TextSelectionEventConverter(inputField.onTextSelection), cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncDeselectEventHandler<string> GetAsyncDeselectEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncDeselectEventHandler<string> GetAsyncDeselectEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onDeselect, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnDeselectAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnDeselectAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onDeselect, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnDeselectAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onDeselect, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnDeselectAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onDeselect, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncSelectEventHandler<string> GetAsyncSelectEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSelect, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncSelectEventHandler<string> GetAsyncSelectEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSelect, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnSelectAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSelect, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnSelectAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSelect, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnSelectAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onSelect, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnSelectAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onSelect, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncSubmitEventHandler<string> GetAsyncSubmitEventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsyncSubmitEventHandler<string> GetAsyncSubmitEventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSubmit, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnSubmitAsync(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<string> OnSubmitAsync(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<string>(inputField.onSubmit, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnSubmitAsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onSubmit, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<string> OnSubmitAsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<string>(inputField.onSubmit, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 79f4f2475e0b2c44e97ed1dee760627b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
<#@ template debug="false" hostspecific="false" language="C#" #>
|
||||||
|
<#@ assembly name="System.Core" #>
|
||||||
|
<#@ import namespace="System.Linq" #>
|
||||||
|
<#@ import namespace="System.Text" #>
|
||||||
|
<#@ import namespace="System.Collections.Generic" #>
|
||||||
|
<#@ output extension=".cs" #>
|
||||||
|
<#
|
||||||
|
var handlers = new (string name, string type)[] {
|
||||||
|
("ValueChanged", "string"),
|
||||||
|
("EndEdit", "string"),
|
||||||
|
("EndTextSelection", "(string, int, int)"),
|
||||||
|
("TextSelection", "(string, int, int)"),
|
||||||
|
("Deselect", "string"),
|
||||||
|
("Select", "string"),
|
||||||
|
("Submit", "string"),
|
||||||
|
};
|
||||||
|
|
||||||
|
Func<string, bool> shouldConvert = x => x.EndsWith("TextSelection");
|
||||||
|
Func<string, string> eventName = x => shouldConvert(x) ? $"new TextSelectionEventConverter(inputField.on{x})" : $"inputField.on{x}";
|
||||||
|
#>
|
||||||
|
#if UNITASK_TEXTMESHPRO_SUPPORT
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using TMPro;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static partial class TextMeshProAsyncExtensions
|
||||||
|
{
|
||||||
|
<# foreach(var (name, type) in handlers) { #>
|
||||||
|
public static IAsync<#= (name) #>EventHandler<<#= type #>> GetAsync<#= (name) #>EventHandler(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<<#= type #>>(<#= eventName(name) #>, inputField.GetCancellationTokenOnDestroy(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IAsync<#= (name) #>EventHandler<<#= type #>> GetAsync<#= (name) #>EventHandler(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<<#= type #>>(<#= eventName(name) #>, cancellationToken, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<<#= type #>> On<#= (name) #>Async(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<<#= type #>>(<#= eventName(name) #>, inputField.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<<#= type #>> On<#= (name) #>Async(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new AsyncUnityEventHandler<<#= type #>>(<#= eventName(name) #>, cancellationToken, true).OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<<#= type #>> On<#= (name) #>AsAsyncEnumerable(this TMP_InputField inputField)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<<#= type #>>(<#= eventName(name) #>, inputField.GetCancellationTokenOnDestroy());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<<#= type #>> On<#= (name) #>AsAsyncEnumerable(this TMP_InputField inputField, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UnityEventHandlerAsyncEnumerable<<#= type #>>(<#= eventName(name) #>, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
<# } #>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9bb9fc551a975d44a7180e022a2debe
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
130
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs
vendored
Normal file
130
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro/TextMeshProAsyncExtensions.cs
vendored
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
#if UNITASK_TEXTMESHPRO_SUPPORT
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using TMPro;
|
||||||
|
using UnityEngine.Events;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static partial class TextMeshProAsyncExtensions
|
||||||
|
{
|
||||||
|
// <string> -> Text
|
||||||
|
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, TMP_Text text, bool rebindOnError = true)
|
||||||
|
{
|
||||||
|
BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError = true)
|
||||||
|
{
|
||||||
|
BindToCore(source, text, cancellationToken, rebindOnError).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable<string> source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError)
|
||||||
|
{
|
||||||
|
var repeat = false;
|
||||||
|
BIND_AGAIN:
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
bool moveNext;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
moveNext = await e.MoveNextAsync();
|
||||||
|
repeat = false;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
if (rebindOnError && !repeat)
|
||||||
|
{
|
||||||
|
repeat = true;
|
||||||
|
goto BIND_AGAIN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!moveNext) return;
|
||||||
|
|
||||||
|
text.text = e.Current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// <T> -> Text
|
||||||
|
|
||||||
|
public static void BindTo<T>(this IUniTaskAsyncEnumerable<T> source, TMP_Text text, bool rebindOnError = true)
|
||||||
|
{
|
||||||
|
BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BindTo<T>(this IUniTaskAsyncEnumerable<T> source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError = true)
|
||||||
|
{
|
||||||
|
BindToCore(source, text, cancellationToken, rebindOnError).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void BindTo<T>(this AsyncReactiveProperty<T> source, TMP_Text text, bool rebindOnError = true)
|
||||||
|
{
|
||||||
|
BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
static async UniTaskVoid BindToCore<T>(IUniTaskAsyncEnumerable<T> source, TMP_Text text, CancellationToken cancellationToken, bool rebindOnError)
|
||||||
|
{
|
||||||
|
var repeat = false;
|
||||||
|
BIND_AGAIN:
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
bool moveNext;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
moveNext = await e.MoveNextAsync();
|
||||||
|
repeat = false;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
if (rebindOnError && !repeat)
|
||||||
|
{
|
||||||
|
repeat = true;
|
||||||
|
goto BIND_AGAIN;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!moveNext) return;
|
||||||
|
|
||||||
|
text.text = e.Current.ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b6ba480edafb67d4e91bb10feb64fae5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef
vendored
Normal file
22
src/UniTask/Assets/Plugins/UniTask/Runtime/External/TextMeshPro/UniTask.TextMeshPro.asmdef
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"name": "UniTask.TextMeshPro",
|
||||||
|
"references": [
|
||||||
|
"UniTask",
|
||||||
|
"Unity.TextMeshPro"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [
|
||||||
|
{
|
||||||
|
"name": "com.unity.textmeshpro",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_TEXTMESHPRO_SUPPORT"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dc47925d1a5fa2946bdd37746b2b5d48
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -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.
|
||||||
@@ -128,6 +132,14 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
case PlayerLoopTiming.LastPostLateUpdate:
|
case PlayerLoopTiming.LastPostLateUpdate:
|
||||||
LastPostLateUpdate();
|
LastPostLateUpdate();
|
||||||
break;
|
break;
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
case PlayerLoopTiming.TimeUpdate:
|
||||||
|
TimeUpdate();
|
||||||
|
break;
|
||||||
|
case PlayerLoopTiming.LastTimeUpdate:
|
||||||
|
LastTimeUpdate();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -150,6 +162,10 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
void LastPreLateUpdate() => RunCore();
|
void LastPreLateUpdate() => RunCore();
|
||||||
void PostLateUpdate() => RunCore();
|
void PostLateUpdate() => RunCore();
|
||||||
void LastPostLateUpdate() => RunCore();
|
void LastPostLateUpdate() => RunCore();
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
void TimeUpdate() => RunCore();
|
||||||
|
void LastTimeUpdate() => RunCore();
|
||||||
|
#endif
|
||||||
|
|
||||||
[System.Diagnostics.DebuggerHidden]
|
[System.Diagnostics.DebuggerHidden]
|
||||||
void RunCore()
|
void RunCore()
|
||||||
@@ -170,11 +186,18 @@ 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
|
||||||
|
{
|
||||||
action();
|
action();
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.LogException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
bool lockTaken = false;
|
bool lockTaken = false;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,6 +118,14 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
case PlayerLoopTiming.LastPostLateUpdate:
|
case PlayerLoopTiming.LastPostLateUpdate:
|
||||||
LastPostLateUpdate();
|
LastPostLateUpdate();
|
||||||
break;
|
break;
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
case PlayerLoopTiming.TimeUpdate:
|
||||||
|
TimeUpdate();
|
||||||
|
break;
|
||||||
|
case PlayerLoopTiming.LastTimeUpdate:
|
||||||
|
LastTimeUpdate();
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -130,6 +148,10 @@ namespace Cysharp.Threading.Tasks.Internal
|
|||||||
void LastPreLateUpdate() => RunCore();
|
void LastPreLateUpdate() => RunCore();
|
||||||
void PostLateUpdate() => RunCore();
|
void PostLateUpdate() => RunCore();
|
||||||
void LastPostLateUpdate() => RunCore();
|
void LastPostLateUpdate() => RunCore();
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
void TimeUpdate() => RunCore();
|
||||||
|
void LastTimeUpdate() => RunCore();
|
||||||
|
#endif
|
||||||
|
|
||||||
[System.Diagnostics.DebuggerHidden]
|
[System.Diagnostics.DebuggerHidden]
|
||||||
void RunCore()
|
void RunCore()
|
||||||
@@ -143,7 +165,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()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Internal
|
||||||
|
{
|
||||||
|
#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT)
|
||||||
|
|
||||||
|
internal static class UnityWebRequestResultExtensions
|
||||||
|
{
|
||||||
|
public static bool IsError(this UnityWebRequest unityWebRequest)
|
||||||
|
{
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
var result = unityWebRequest.result;
|
||||||
|
return (result == UnityWebRequest.Result.ConnectionError)
|
||||||
|
|| (result == UnityWebRequest.Result.DataProcessingError)
|
||||||
|
|| (result == UnityWebRequest.Result.ProtocolError);
|
||||||
|
#else
|
||||||
|
return unityWebRequest.isHttpError || unityWebRequest.isNetworkError;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 111ba0e639de1d7428af6c823ead4918
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Internal
|
||||||
|
{
|
||||||
|
internal readonly struct ValueStopwatch
|
||||||
|
{
|
||||||
|
static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;
|
||||||
|
|
||||||
|
readonly long startTimestamp;
|
||||||
|
|
||||||
|
public static ValueStopwatch StartNew() => new ValueStopwatch(Stopwatch.GetTimestamp());
|
||||||
|
|
||||||
|
ValueStopwatch(long startTimestamp)
|
||||||
|
{
|
||||||
|
this.startTimestamp = startTimestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TimeSpan Elapsed => TimeSpan.FromTicks(this.ElapsedTicks);
|
||||||
|
|
||||||
|
public bool IsInvalid => startTimestamp == 0;
|
||||||
|
|
||||||
|
public long ElapsedTicks
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (startTimestamp == 0)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("Detected invalid initialization(use 'default'), only to create from StartNew().");
|
||||||
|
}
|
||||||
|
|
||||||
|
var delta = Stopwatch.GetTimestamp() - startTimestamp;
|
||||||
|
return (long)(delta * TimestampToTicks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f16fb466974ad034c8732c79c7fd67ea
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
174
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/Create.cs
Normal file
174
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/Create.cs
Normal file
@@ -0,0 +1,174 @@
|
|||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Linq
|
||||||
|
{
|
||||||
|
public static partial class UniTaskAsyncEnumerable
|
||||||
|
{
|
||||||
|
public static IUniTaskAsyncEnumerable<T> Create<T>(Func<IAsyncWriter<T>, CancellationToken, UniTask> create)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(create, nameof(create));
|
||||||
|
return new Create<T>(create);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAsyncWriter<T>
|
||||||
|
{
|
||||||
|
UniTask YieldAsync(T value);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class Create<T> : IUniTaskAsyncEnumerable<T>
|
||||||
|
{
|
||||||
|
readonly Func<IAsyncWriter<T>, CancellationToken, UniTask> create;
|
||||||
|
|
||||||
|
public Create(Func<IAsyncWriter<T>, CancellationToken, UniTask> create)
|
||||||
|
{
|
||||||
|
this.create = create;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IUniTaskAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return new _Create(create, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class _Create : MoveNextSource, IUniTaskAsyncEnumerator<T>
|
||||||
|
{
|
||||||
|
readonly Func<IAsyncWriter<T>, CancellationToken, UniTask> create;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
int state = -1;
|
||||||
|
AsyncWriter writer;
|
||||||
|
|
||||||
|
public _Create(Func<IAsyncWriter<T>, CancellationToken, UniTask> create, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.create = create;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Current { get; private set; }
|
||||||
|
|
||||||
|
public UniTask DisposeAsync()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask<bool> MoveNextAsync()
|
||||||
|
{
|
||||||
|
if (state == -2) return default;
|
||||||
|
|
||||||
|
completionSource.Reset();
|
||||||
|
MoveNext();
|
||||||
|
return new UniTask<bool>(this, completionSource.Version);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MoveNext()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch (state)
|
||||||
|
{
|
||||||
|
case -1: // init
|
||||||
|
{
|
||||||
|
writer = new AsyncWriter(this);
|
||||||
|
RunWriterTask(create(writer, cancellationToken)).Forget();
|
||||||
|
if (Volatile.Read(ref state) == -2)
|
||||||
|
{
|
||||||
|
return; // complete synchronously
|
||||||
|
}
|
||||||
|
state = 0; // wait YieldAsync, it set TrySetResult(true)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
case 0:
|
||||||
|
writer.SignalWriter();
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
goto DONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
state = -2;
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DONE:
|
||||||
|
state = -2;
|
||||||
|
completionSource.TrySetResult(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTaskVoid RunWriterTask(UniTask task)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await task;
|
||||||
|
goto DONE;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Volatile.Write(ref state, -2);
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DONE:
|
||||||
|
Volatile.Write(ref state, -2);
|
||||||
|
completionSource.TrySetResult(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetResult(T value)
|
||||||
|
{
|
||||||
|
Current = value;
|
||||||
|
completionSource.TrySetResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AsyncWriter : IUniTaskSource, IAsyncWriter<T>
|
||||||
|
{
|
||||||
|
readonly _Create enumerator;
|
||||||
|
|
||||||
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
|
public AsyncWriter(_Create enumerator)
|
||||||
|
{
|
||||||
|
this.enumerator = enumerator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask YieldAsync(T value)
|
||||||
|
{
|
||||||
|
core.Reset();
|
||||||
|
enumerator.SetResult(value);
|
||||||
|
return new UniTask(this, core.Version);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SignalWriter()
|
||||||
|
{
|
||||||
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0202f723469f93945afa063bfb440d15
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -88,6 +88,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -156,6 +157,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -195,6 +197,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -263,6 +266,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,6 +306,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -382,6 +387,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -422,6 +428,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -502,6 +509,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -541,6 +549,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -621,6 +630,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -661,6 +671,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.selector = selector;
|
this.selector = selector;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TResult Current { get; private set; }
|
public TResult Current { get; private set; }
|
||||||
@@ -741,6 +752,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
187
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/SkipUntil.cs
Normal file
187
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/SkipUntil.cs
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Linq
|
||||||
|
{
|
||||||
|
public static partial class UniTaskAsyncEnumerable
|
||||||
|
{
|
||||||
|
public static IUniTaskAsyncEnumerable<TSource> SkipUntil<TSource>(this IUniTaskAsyncEnumerable<TSource> source, UniTask other)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
|
||||||
|
return new SkipUntil<TSource>(source, other, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<TSource> SkipUntil<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<CancellationToken, UniTask> other)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(other));
|
||||||
|
|
||||||
|
return new SkipUntil<TSource>(source, default, other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class SkipUntil<TSource> : IUniTaskAsyncEnumerable<TSource>
|
||||||
|
{
|
||||||
|
readonly IUniTaskAsyncEnumerable<TSource> source;
|
||||||
|
readonly UniTask other;
|
||||||
|
readonly Func<CancellationToken, UniTask> other2;
|
||||||
|
|
||||||
|
public SkipUntil(IUniTaskAsyncEnumerable<TSource> source, UniTask other, Func<CancellationToken, UniTask> other2)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
this.other = other;
|
||||||
|
this.other2 = other2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IUniTaskAsyncEnumerator<TSource> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (other2 != null)
|
||||||
|
{
|
||||||
|
return new _SkipUntil(source, this.other2(cancellationToken), cancellationToken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new _SkipUntil(source, this.other, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class _SkipUntil : MoveNextSource, IUniTaskAsyncEnumerator<TSource>
|
||||||
|
{
|
||||||
|
static readonly Action<object> CancelDelegate1 = OnCanceled1;
|
||||||
|
static readonly Action<object> MoveNextCoreDelegate = MoveNextCore;
|
||||||
|
|
||||||
|
readonly IUniTaskAsyncEnumerable<TSource> source;
|
||||||
|
CancellationToken cancellationToken1;
|
||||||
|
|
||||||
|
bool completed;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration1;
|
||||||
|
IUniTaskAsyncEnumerator<TSource> enumerator;
|
||||||
|
UniTask<bool>.Awaiter awaiter;
|
||||||
|
bool continueNext;
|
||||||
|
Exception exception;
|
||||||
|
|
||||||
|
public _SkipUntil(IUniTaskAsyncEnumerable<TSource> source, UniTask other, CancellationToken cancellationToken1)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
this.cancellationToken1 = cancellationToken1;
|
||||||
|
if (cancellationToken1.CanBeCanceled)
|
||||||
|
{
|
||||||
|
this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
|
RunOther(other).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TSource Current { get; private set; }
|
||||||
|
|
||||||
|
public UniTask<bool> MoveNextAsync()
|
||||||
|
{
|
||||||
|
if (exception != null)
|
||||||
|
{
|
||||||
|
return UniTask.FromException<bool>(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancellationToken1.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return UniTask.FromCanceled<bool>(cancellationToken1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enumerator == null)
|
||||||
|
{
|
||||||
|
enumerator = source.GetAsyncEnumerator(cancellationToken1);
|
||||||
|
}
|
||||||
|
completionSource.Reset();
|
||||||
|
|
||||||
|
if (completed)
|
||||||
|
{
|
||||||
|
SourceMoveNext();
|
||||||
|
}
|
||||||
|
return new UniTask<bool>(this, completionSource.Version);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceMoveNext()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LOOP:
|
||||||
|
awaiter = enumerator.MoveNextAsync().GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
continueNext = true;
|
||||||
|
MoveNextCore(this);
|
||||||
|
if (continueNext)
|
||||||
|
{
|
||||||
|
continueNext = false;
|
||||||
|
goto LOOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
awaiter.SourceOnCompleted(MoveNextCoreDelegate, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MoveNextCore(object state)
|
||||||
|
{
|
||||||
|
var self = (_SkipUntil)state;
|
||||||
|
|
||||||
|
if (self.TryGetResult(self.awaiter, out var result))
|
||||||
|
{
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
self.Current = self.enumerator.Current;
|
||||||
|
self.completionSource.TrySetResult(true);
|
||||||
|
if (self.continueNext)
|
||||||
|
{
|
||||||
|
self.SourceMoveNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetResult(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTaskVoid RunOther(UniTask other)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await other;
|
||||||
|
completed = true;
|
||||||
|
SourceMoveNext();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
exception = ex;
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnCanceled1(object state)
|
||||||
|
{
|
||||||
|
var self = (_SkipUntil)state;
|
||||||
|
self.completionSource.TrySetCanceled(self.cancellationToken1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask DisposeAsync()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
cancellationTokenRegistration1.Dispose();
|
||||||
|
if (enumerator != null)
|
||||||
|
{
|
||||||
|
return enumerator.DisposeAsync();
|
||||||
|
}
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: de932d79c8d9f3841a066d05ff29edc9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -32,13 +32,17 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
sealed class _SkipUntilCanceled : MoveNextSource, IUniTaskAsyncEnumerator<TSource>
|
sealed class _SkipUntilCanceled : MoveNextSource, IUniTaskAsyncEnumerator<TSource>
|
||||||
{
|
{
|
||||||
|
static readonly Action<object> CancelDelegate1 = OnCanceled1;
|
||||||
|
static readonly Action<object> CancelDelegate2 = OnCanceled2;
|
||||||
static readonly Action<object> MoveNextCoreDelegate = MoveNextCore;
|
static readonly Action<object> MoveNextCoreDelegate = MoveNextCore;
|
||||||
|
|
||||||
readonly IUniTaskAsyncEnumerable<TSource> source;
|
readonly IUniTaskAsyncEnumerable<TSource> source;
|
||||||
CancellationToken cancellationToken1;
|
CancellationToken cancellationToken1;
|
||||||
CancellationToken cancellationToken2;
|
CancellationToken cancellationToken2;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration1;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration2;
|
||||||
|
|
||||||
bool isCanceled;
|
int isCanceled;
|
||||||
IUniTaskAsyncEnumerator<TSource> enumerator;
|
IUniTaskAsyncEnumerator<TSource> enumerator;
|
||||||
UniTask<bool>.Awaiter awaiter;
|
UniTask<bool>.Awaiter awaiter;
|
||||||
bool continueNext;
|
bool continueNext;
|
||||||
@@ -48,6 +52,14 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.source = source;
|
this.source = source;
|
||||||
this.cancellationToken1 = cancellationToken1;
|
this.cancellationToken1 = cancellationToken1;
|
||||||
this.cancellationToken2 = cancellationToken2;
|
this.cancellationToken2 = cancellationToken2;
|
||||||
|
if (cancellationToken1.CanBeCanceled)
|
||||||
|
{
|
||||||
|
this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this);
|
||||||
|
}
|
||||||
|
if (cancellationToken1 != cancellationToken2 && cancellationToken2.CanBeCanceled)
|
||||||
|
{
|
||||||
|
this.cancellationTokenRegistration2 = cancellationToken2.RegisterWithoutCaptureExecutionContext(CancelDelegate2, this);
|
||||||
|
}
|
||||||
TaskTracker.TrackActiveTask(this, 3);
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,15 +67,18 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask<bool> MoveNextAsync()
|
public UniTask<bool> MoveNextAsync()
|
||||||
{
|
{
|
||||||
if (cancellationToken1.IsCancellationRequested) isCanceled = true;
|
|
||||||
if (cancellationToken2.IsCancellationRequested) isCanceled = true;
|
|
||||||
|
|
||||||
if (enumerator == null)
|
if (enumerator == null)
|
||||||
{
|
{
|
||||||
|
if (cancellationToken1.IsCancellationRequested) isCanceled = 1;
|
||||||
|
if (cancellationToken2.IsCancellationRequested) isCanceled = 1;
|
||||||
enumerator = source.GetAsyncEnumerator(cancellationToken2); // use only AsyncEnumerator provided token.
|
enumerator = source.GetAsyncEnumerator(cancellationToken2); // use only AsyncEnumerator provided token.
|
||||||
}
|
}
|
||||||
completionSource.Reset();
|
completionSource.Reset();
|
||||||
|
|
||||||
|
if (isCanceled != 0)
|
||||||
|
{
|
||||||
SourceMoveNext();
|
SourceMoveNext();
|
||||||
|
}
|
||||||
return new UniTask<bool>(this, completionSource.Version);
|
return new UniTask<bool>(this, completionSource.Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,27 +117,13 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
{
|
{
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
AGAIN:
|
|
||||||
|
|
||||||
if (self.isCanceled)
|
|
||||||
{
|
|
||||||
self.continueNext = false;
|
|
||||||
self.Current = self.enumerator.Current;
|
self.Current = self.enumerator.Current;
|
||||||
self.completionSource.TrySetResult(true);
|
self.completionSource.TrySetResult(true);
|
||||||
}
|
if (self.continueNext)
|
||||||
else
|
|
||||||
{
|
|
||||||
if (self.cancellationToken1.IsCancellationRequested) self.isCanceled = true;
|
|
||||||
if (self.cancellationToken2.IsCancellationRequested) self.isCanceled = true;
|
|
||||||
|
|
||||||
if (self.isCanceled) goto AGAIN;
|
|
||||||
|
|
||||||
if (!self.continueNext)
|
|
||||||
{
|
{
|
||||||
self.SourceMoveNext();
|
self.SourceMoveNext();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
self.completionSource.TrySetResult(false);
|
self.completionSource.TrySetResult(false);
|
||||||
@@ -130,9 +131,37 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void OnCanceled1(object state)
|
||||||
|
{
|
||||||
|
var self = (_SkipUntilCanceled)state;
|
||||||
|
if (self.isCanceled == 0)
|
||||||
|
{
|
||||||
|
if (Interlocked.Increment(ref self.isCanceled) == 1)
|
||||||
|
{
|
||||||
|
self.cancellationTokenRegistration2.Dispose();
|
||||||
|
self.SourceMoveNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnCanceled2(object state)
|
||||||
|
{
|
||||||
|
var self = (_SkipUntilCanceled)state;
|
||||||
|
if (self.isCanceled == 0)
|
||||||
|
{
|
||||||
|
if (Interlocked.Increment(ref self.isCanceled) == 1)
|
||||||
|
{
|
||||||
|
self.cancellationTokenRegistration2.Dispose();
|
||||||
|
self.SourceMoveNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
|
cancellationTokenRegistration1.Dispose();
|
||||||
|
cancellationTokenRegistration2.Dispose();
|
||||||
if (enumerator != null)
|
if (enumerator != null)
|
||||||
{
|
{
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
|
|||||||
536
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/Subscribe.cs
Normal file
536
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/Subscribe.cs
Normal file
@@ -0,0 +1,536 @@
|
|||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using Subscribes = Cysharp.Threading.Tasks.Linq.Subscribe;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Linq
|
||||||
|
{
|
||||||
|
public static partial class UniTaskAsyncEnumerable
|
||||||
|
{
|
||||||
|
// OnNext
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> action)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> action)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTaskVoid> action)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> action, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> action, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTaskVoid> action, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(action, nameof(action));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, action, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnNext, OnError
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> onNext, Action<Exception> onError)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> onNext, Action<Exception> onError, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, Action<Exception> onError)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, Action<Exception> onError, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, Action<Exception> onError)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, Action<Exception> onError, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onError, nameof(onError));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, onError, Subscribes.NopCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnNext, OnCompleted
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> onNext, Action onCompleted)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> onNext, Action onCompleted)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Action<TSource> onNext, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> onNext, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, Action onCompleted)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IDisposable SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, Action onCompleted)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void SubscribeAwait<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(onNext, nameof(onNext));
|
||||||
|
Error.ThrowArgumentNullException(onCompleted, nameof(onCompleted));
|
||||||
|
|
||||||
|
Subscribes.SubscribeAwaitCore(source, onNext, Subscribes.NopError, onCompleted, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
// IObserver
|
||||||
|
|
||||||
|
public static IDisposable Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, IObserver<TSource> observer)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(observer, nameof(observer));
|
||||||
|
|
||||||
|
var cts = new CancellationTokenDisposable();
|
||||||
|
Subscribes.SubscribeCore(source, observer, cts.Token).Forget();
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Subscribe<TSource>(this IUniTaskAsyncEnumerable<TSource> source, IObserver<TSource> observer, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(observer, nameof(observer));
|
||||||
|
|
||||||
|
Subscribes.SubscribeCore(source, observer, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class CancellationTokenDisposable : IDisposable
|
||||||
|
{
|
||||||
|
readonly CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
|
|
||||||
|
public CancellationToken Token => cts.Token;
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if (!cts.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
cts.Cancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static class Subscribe
|
||||||
|
{
|
||||||
|
public static readonly Action<Exception> NopError = _ => { };
|
||||||
|
public static readonly Action NopCompleted = () => { };
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, Action<TSource> onNext, Action<Exception> onError, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
onNext(e.Current);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (onError == NopError)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
onError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTaskVoid> onNext, Action<Exception> onError, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
onNext(e.Current).Forget();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (onError == NopError)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
onError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTaskVoid> onNext, Action<Exception> onError, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
onNext(e.Current, cancellationToken).Forget();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (onError == NopError)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
onError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, IObserver<TSource> observer, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
observer.OnNext(e.Current);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
observer.OnCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
observer.OnError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeAwaitCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, Func<TSource, UniTask> onNext, Action<Exception> onError, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await onNext(e.Current);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (onError == NopError)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
onError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async UniTaskVoid SubscribeAwaitCore<TSource>(IUniTaskAsyncEnumerable<TSource> source, Func<TSource, CancellationToken, UniTask> onNext, Action<Exception> onError, Action onCompleted, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
var e = source.GetAsyncEnumerator(cancellationToken);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while (await e.MoveNextAsync())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await onNext(e.Current, cancellationToken);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onCompleted();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
if (onError == NopError)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ex is OperationCanceledException) return;
|
||||||
|
|
||||||
|
onError(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (e != null)
|
||||||
|
{
|
||||||
|
await e.DisposeAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 263479eb04c189741931fc0e2f615c2d
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
190
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/TakeUntil.cs
Normal file
190
src/UniTask/Assets/Plugins/UniTask/Runtime/Linq/TakeUntil.cs
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks.Linq
|
||||||
|
{
|
||||||
|
public static partial class UniTaskAsyncEnumerable
|
||||||
|
{
|
||||||
|
public static IUniTaskAsyncEnumerable<TSource> TakeUntil<TSource>(this IUniTaskAsyncEnumerable<TSource> source, UniTask other)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
|
||||||
|
return new TakeUntil<TSource>(source, other, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskAsyncEnumerable<TSource> TakeUntil<TSource>(this IUniTaskAsyncEnumerable<TSource> source, Func<CancellationToken, UniTask> other)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(source));
|
||||||
|
Error.ThrowArgumentNullException(source, nameof(other));
|
||||||
|
|
||||||
|
return new TakeUntil<TSource>(source, default, other);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class TakeUntil<TSource> : IUniTaskAsyncEnumerable<TSource>
|
||||||
|
{
|
||||||
|
readonly IUniTaskAsyncEnumerable<TSource> source;
|
||||||
|
readonly UniTask other;
|
||||||
|
readonly Func<CancellationToken, UniTask> other2;
|
||||||
|
|
||||||
|
public TakeUntil(IUniTaskAsyncEnumerable<TSource> source, UniTask other, Func<CancellationToken, UniTask> other2)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
this.other = other;
|
||||||
|
this.other2 = other2;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IUniTaskAsyncEnumerator<TSource> GetAsyncEnumerator(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (other2 != null)
|
||||||
|
{
|
||||||
|
return new _TakeUntil(source, this.other2(cancellationToken), cancellationToken);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return new _TakeUntil(source, this.other, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class _TakeUntil : MoveNextSource, IUniTaskAsyncEnumerator<TSource>
|
||||||
|
{
|
||||||
|
static readonly Action<object> CancelDelegate1 = OnCanceled1;
|
||||||
|
static readonly Action<object> MoveNextCoreDelegate = MoveNextCore;
|
||||||
|
|
||||||
|
readonly IUniTaskAsyncEnumerable<TSource> source;
|
||||||
|
CancellationToken cancellationToken1;
|
||||||
|
CancellationTokenRegistration cancellationTokenRegistration1;
|
||||||
|
|
||||||
|
bool completed;
|
||||||
|
Exception exception;
|
||||||
|
IUniTaskAsyncEnumerator<TSource> enumerator;
|
||||||
|
UniTask<bool>.Awaiter awaiter;
|
||||||
|
|
||||||
|
public _TakeUntil(IUniTaskAsyncEnumerable<TSource> source, UniTask other, CancellationToken cancellationToken1)
|
||||||
|
{
|
||||||
|
this.source = source;
|
||||||
|
this.cancellationToken1 = cancellationToken1;
|
||||||
|
|
||||||
|
if (cancellationToken1.CanBeCanceled)
|
||||||
|
{
|
||||||
|
this.cancellationTokenRegistration1 = cancellationToken1.RegisterWithoutCaptureExecutionContext(CancelDelegate1, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
|
|
||||||
|
RunOther(other).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TSource Current { get; private set; }
|
||||||
|
|
||||||
|
public UniTask<bool> MoveNextAsync()
|
||||||
|
{
|
||||||
|
if (completed)
|
||||||
|
{
|
||||||
|
return CompletedTasks.False;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (exception != null)
|
||||||
|
{
|
||||||
|
return UniTask.FromException<bool>(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancellationToken1.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return UniTask.FromCanceled<bool>(cancellationToken1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enumerator == null)
|
||||||
|
{
|
||||||
|
enumerator = source.GetAsyncEnumerator(cancellationToken1);
|
||||||
|
}
|
||||||
|
|
||||||
|
completionSource.Reset();
|
||||||
|
SourceMoveNext();
|
||||||
|
return new UniTask<bool>(this, completionSource.Version);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceMoveNext()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
awaiter = enumerator.MoveNextAsync().GetAwaiter();
|
||||||
|
if (awaiter.IsCompleted)
|
||||||
|
{
|
||||||
|
MoveNextCore(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
awaiter.SourceOnCompleted(MoveNextCoreDelegate, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void MoveNextCore(object state)
|
||||||
|
{
|
||||||
|
var self = (_TakeUntil)state;
|
||||||
|
|
||||||
|
if (self.TryGetResult(self.awaiter, out var result))
|
||||||
|
{
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
if (self.exception != null)
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetException(self.exception);
|
||||||
|
}
|
||||||
|
else if (self.cancellationToken1.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetCanceled(self.cancellationToken1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.Current = self.enumerator.Current;
|
||||||
|
self.completionSource.TrySetResult(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.completionSource.TrySetResult(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTaskVoid RunOther(UniTask other)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await other;
|
||||||
|
completed = true;
|
||||||
|
completionSource.TrySetResult(false);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
exception = ex;
|
||||||
|
completionSource.TrySetException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void OnCanceled1(object state)
|
||||||
|
{
|
||||||
|
var self = (_TakeUntil)state;
|
||||||
|
self.completionSource.TrySetCanceled(self.cancellationToken1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask DisposeAsync()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
cancellationTokenRegistration1.Dispose();
|
||||||
|
if (enumerator != null)
|
||||||
|
{
|
||||||
|
return enumerator.DisposeAsync();
|
||||||
|
}
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 12bda324162f15349afefc2c152ac07f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -19,8 +19,6 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
{
|
{
|
||||||
internal static async UniTask<TSource[]> ToArrayAsync<TSource>(IUniTaskAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
|
internal static async UniTask<TSource[]> ToArrayAsync<TSource>(IUniTaskAsyncEnumerable<TSource> source, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// UnityEngine.Debug.Log("Called ToArray");
|
|
||||||
|
|
||||||
var pool = ArrayPool<TSource>.Shared;
|
var pool = ArrayPool<TSource>.Shared;
|
||||||
var array = pool.Rent(16);
|
var array = pool.Rent(16);
|
||||||
|
|
||||||
|
|||||||
@@ -248,6 +248,8 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
return current;
|
return current;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock (queuedResult)
|
||||||
|
{
|
||||||
if (queuedResult.Count != 0)
|
if (queuedResult.Count != 0)
|
||||||
{
|
{
|
||||||
current = queuedResult.Dequeue();
|
current = queuedResult.Dequeue();
|
||||||
@@ -260,6 +262,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public UniTask<bool> MoveNextAsync()
|
public UniTask<bool> MoveNextAsync()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellationToken)
|
public _EveryUpdate(PlayerLoopTiming updateTiming, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.updateTiming = updateTiming;
|
this.updateTiming = updateTiming;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
TaskTracker.TrackActiveTask(this, 2);
|
||||||
PlayerLoopHelper.AddAction(updateTiming, this);
|
PlayerLoopHelper.AddAction(updateTiming, this);
|
||||||
|
|||||||
@@ -208,7 +208,6 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
UnityEngine.Debug.Log("TRY_RESULT:" + target.TryGetTarget(out var _));
|
|
||||||
if (disposed || cancellationToken.IsCancellationRequested || !target.TryGetTarget(out var t))
|
if (disposed || cancellationToken.IsCancellationRequested || !target.TryGetTarget(out var t))
|
||||||
{
|
{
|
||||||
completionSource.TrySetResult(false);
|
completionSource.TrySetResult(false);
|
||||||
|
|||||||
@@ -100,10 +100,11 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
if (this.period <= 0) this.period = 1;
|
if (this.period <= 0) this.period = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.initialFrame = Time.frameCount;
|
this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
this.dueTimePhase = true;
|
this.dueTimePhase = true;
|
||||||
this.updateTiming = updateTiming;
|
this.updateTiming = updateTiming;
|
||||||
this.ignoreTimeScale = ignoreTimeScale;
|
this.ignoreTimeScale = ignoreTimeScale;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
TaskTracker.TrackActiveTask(this, 2);
|
||||||
PlayerLoopHelper.AddAction(updateTiming, this);
|
PlayerLoopHelper.AddAction(updateTiming, this);
|
||||||
}
|
}
|
||||||
@@ -219,10 +220,11 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
if (periodFrameCount <= 0) periodFrameCount = 1;
|
if (periodFrameCount <= 0) periodFrameCount = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.initialFrame = Time.frameCount;
|
this.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
this.dueTimePhase = true;
|
this.dueTimePhase = true;
|
||||||
this.dueTimeFrameCount = dueTimeFrameCount;
|
this.dueTimeFrameCount = dueTimeFrameCount;
|
||||||
this.periodFrameCount = periodFrameCount;
|
this.periodFrameCount = periodFrameCount;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
TaskTracker.TrackActiveTask(this, 2);
|
||||||
PlayerLoopHelper.AddAction(updateTiming, this);
|
PlayerLoopHelper.AddAction(updateTiming, this);
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -165,6 +166,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -204,6 +206,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -281,6 +284,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -320,6 +324,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -410,6 +415,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -450,6 +456,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -540,6 +547,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -579,6 +587,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -669,6 +678,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -709,6 +719,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
this.cancellationToken = cancellationToken;
|
this.cancellationToken = cancellationToken;
|
||||||
this.moveNextAction = MoveNext;
|
this.moveNextAction = MoveNext;
|
||||||
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
public TSource Current { get; private set; }
|
public TSource Current { get; private set; }
|
||||||
@@ -799,6 +810,7 @@ namespace Cysharp.Threading.Tasks.Linq
|
|||||||
|
|
||||||
public UniTask DisposeAsync()
|
public UniTask DisposeAsync()
|
||||||
{
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
return enumerator.DisposeAsync();
|
return enumerator.DisposeAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,10 @@ using System.Threading;
|
|||||||
|
|
||||||
#if UNITY_2019_3_OR_NEWER
|
#if UNITY_2019_3_OR_NEWER
|
||||||
using UnityEngine.LowLevel;
|
using UnityEngine.LowLevel;
|
||||||
|
using PlayerLoopType = UnityEngine.PlayerLoop;
|
||||||
#else
|
#else
|
||||||
using UnityEngine.Experimental.LowLevel;
|
using UnityEngine.Experimental.LowLevel;
|
||||||
|
using PlayerLoopType = UnityEngine.Experimental.PlayerLoop;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
@@ -57,6 +59,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public struct UniTaskLoopRunnerLastYieldUpdate { };
|
public struct UniTaskLoopRunnerLastYieldUpdate { };
|
||||||
public struct UniTaskLoopRunnerLastYieldPreLateUpdate { };
|
public struct UniTaskLoopRunnerLastYieldPreLateUpdate { };
|
||||||
public struct UniTaskLoopRunnerLastYieldPostLateUpdate { };
|
public struct UniTaskLoopRunnerLastYieldPostLateUpdate { };
|
||||||
|
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
public struct UniTaskLoopRunnerTimeUpdate { };
|
||||||
|
public struct UniTaskLoopRunnerLastTimeUpdate { };
|
||||||
|
public struct UniTaskLoopRunnerYieldTimeUpdate { };
|
||||||
|
public struct UniTaskLoopRunnerLastYieldTimeUpdate { };
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum PlayerLoopTiming
|
public enum PlayerLoopTiming
|
||||||
@@ -80,7 +89,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
LastPreLateUpdate = 11,
|
LastPreLateUpdate = 11,
|
||||||
|
|
||||||
PostLateUpdate = 12,
|
PostLateUpdate = 12,
|
||||||
LastPostLateUpdate = 13
|
LastPostLateUpdate = 13,
|
||||||
|
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
// Unity 2020.2 added TimeUpdate https://docs.unity3d.com/2020.2/Documentation/ScriptReference/PlayerLoop.TimeUpdate.html
|
||||||
|
TimeUpdate = 14,
|
||||||
|
LastTimeUpdate = 15,
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface IPlayerLoopItem
|
public interface IPlayerLoopItem
|
||||||
@@ -94,12 +109,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static int MainThreadId => mainThreadId;
|
public static int MainThreadId => mainThreadId;
|
||||||
internal static string ApplicationDataPath => applicationDataPath;
|
internal static string ApplicationDataPath => applicationDataPath;
|
||||||
|
|
||||||
|
public static bool IsMainThread => Thread.CurrentThread.ManagedThreadId == mainThreadId;
|
||||||
|
|
||||||
static int mainThreadId;
|
static int mainThreadId;
|
||||||
static string applicationDataPath;
|
static string applicationDataPath;
|
||||||
static SynchronizationContext unitySynchronizationContetext;
|
static SynchronizationContext unitySynchronizationContetext;
|
||||||
static ContinuationQueue[] yielders;
|
static ContinuationQueue[] yielders;
|
||||||
static PlayerLoopRunner[] runners;
|
static PlayerLoopRunner[] runners;
|
||||||
|
internal static bool IsEditorApplicationQuitting { get; private set; }
|
||||||
static PlayerLoopSystem[] InsertRunner(PlayerLoopSystem loopSystem,
|
static PlayerLoopSystem[] InsertRunner(PlayerLoopSystem loopSystem,
|
||||||
Type loopRunnerYieldType, ContinuationQueue cq, Type lastLoopRunnerYieldType, ContinuationQueue lastCq,
|
Type loopRunnerYieldType, ContinuationQueue cq, Type lastLoopRunnerYieldType, ContinuationQueue lastCq,
|
||||||
Type loopRunnerType, PlayerLoopRunner runner, Type lastLoopRunnerType, PlayerLoopRunner lastRunner)
|
Type loopRunnerType, PlayerLoopRunner runner, Type lastLoopRunnerType, PlayerLoopRunner lastRunner)
|
||||||
@@ -108,28 +125,33 @@ 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;
|
IsEditorApplicationQuitting = true;
|
||||||
}
|
// run rest action before clear.
|
||||||
|
|
||||||
if (runner != null)
|
if (runner != null)
|
||||||
{
|
{
|
||||||
|
runner.Run();
|
||||||
runner.Clear();
|
runner.Clear();
|
||||||
}
|
}
|
||||||
if (lastRunner != null)
|
if (lastRunner != null)
|
||||||
{
|
{
|
||||||
|
lastRunner.Run();
|
||||||
lastRunner.Clear();
|
lastRunner.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cq != null)
|
if (cq != null)
|
||||||
{
|
{
|
||||||
|
cq.Run();
|
||||||
cq.Clear();
|
cq.Clear();
|
||||||
}
|
}
|
||||||
if (lastCq != null)
|
if (lastCq != null)
|
||||||
{
|
{
|
||||||
|
lastCq.Run();
|
||||||
lastCq.Clear();
|
lastCq.Clear();
|
||||||
}
|
}
|
||||||
|
IsEditorApplicationQuitting = false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -173,6 +195,32 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PlayerLoopSystem[] InsertUniTaskSynchronizationContext(PlayerLoopSystem loopSystem)
|
||||||
|
{
|
||||||
|
var loop = new PlayerLoopSystem
|
||||||
|
{
|
||||||
|
type = typeof(UniTaskSynchronizationContext),
|
||||||
|
updateDelegate = UniTaskSynchronizationContext.Run
|
||||||
|
};
|
||||||
|
|
||||||
|
// Remove items from previous initializations.
|
||||||
|
var source = loopSystem.subSystemList
|
||||||
|
.Where(ls => ls.type != typeof(UniTaskSynchronizationContext))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
var dest = new System.Collections.Generic.List<PlayerLoopSystem>(source);
|
||||||
|
|
||||||
|
var index = dest.FindIndex(x => x.type.Name == "ScriptRunDelayedTasks");
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
index = dest.FindIndex(x => x.type.Name == "UniTaskLoopRunnerUpdate");
|
||||||
|
}
|
||||||
|
|
||||||
|
dest.Insert(index + 1, loop);
|
||||||
|
|
||||||
|
return dest.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
|
||||||
static void Init()
|
static void Init()
|
||||||
{
|
{
|
||||||
@@ -244,52 +292,90 @@ namespace Cysharp.Threading.Tasks
|
|||||||
if (item != null) item.Run();
|
if (item != null) item.Run();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniTaskSynchronizationContext.Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
private static int FindLoopSystemIndex(PlayerLoopSystem[] playerLoopList, Type systemType)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < playerLoopList.Length; i++)
|
||||||
|
{
|
||||||
|
if (playerLoopList[i].type == systemType)
|
||||||
|
{
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Exception("Target PlayerLoopSystem does not found. Type:" + systemType.FullName);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Initialize(ref PlayerLoopSystem playerLoop)
|
public static void Initialize(ref PlayerLoopSystem playerLoop)
|
||||||
{
|
{
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
yielders = new ContinuationQueue[16];
|
||||||
|
runners = new PlayerLoopRunner[16];
|
||||||
|
#else
|
||||||
yielders = new ContinuationQueue[14];
|
yielders = new ContinuationQueue[14];
|
||||||
runners = new PlayerLoopRunner[14];
|
runners = new PlayerLoopRunner[14];
|
||||||
|
#endif
|
||||||
|
|
||||||
var copyList = playerLoop.subSystemList.ToArray();
|
var copyList = playerLoop.subSystemList.ToArray();
|
||||||
|
|
||||||
// Initialization
|
var i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Initialization));
|
||||||
copyList[0].subSystemList = InsertRunner(copyList[0], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), yielders[0] = new ContinuationQueue(PlayerLoopTiming.Initialization),
|
copyList[i].subSystemList = InsertRunner(copyList[i], 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),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.EarlyUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), yielders[2] = new ContinuationQueue(PlayerLoopTiming.EarlyUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldEarlyUpdate), yielders[3] = new ContinuationQueue(PlayerLoopTiming.LastEarlyUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldEarlyUpdate), yielders[3] = new ContinuationQueue(PlayerLoopTiming.LastEarlyUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerEarlyUpdate), runners[2] = new PlayerLoopRunner(PlayerLoopTiming.EarlyUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerEarlyUpdate), runners[2] = new PlayerLoopRunner(PlayerLoopTiming.EarlyUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastEarlyUpdate), runners[3] = new PlayerLoopRunner(PlayerLoopTiming.LastEarlyUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastEarlyUpdate), runners[3] = new PlayerLoopRunner(PlayerLoopTiming.LastEarlyUpdate));
|
||||||
// FixedUpdate
|
// FixedUpdate
|
||||||
copyList[2].subSystemList = InsertRunner(copyList[2], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldFixedUpdate), yielders[4] = new ContinuationQueue(PlayerLoopTiming.FixedUpdate),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.FixedUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldFixedUpdate), yielders[4] = new ContinuationQueue(PlayerLoopTiming.FixedUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldFixedUpdate), yielders[5] = new ContinuationQueue(PlayerLoopTiming.LastFixedUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldFixedUpdate), yielders[5] = new ContinuationQueue(PlayerLoopTiming.LastFixedUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerFixedUpdate), runners[4] = new PlayerLoopRunner(PlayerLoopTiming.FixedUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerFixedUpdate), runners[4] = new PlayerLoopRunner(PlayerLoopTiming.FixedUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastFixedUpdate), runners[5] = new PlayerLoopRunner(PlayerLoopTiming.LastFixedUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastFixedUpdate), runners[5] = new PlayerLoopRunner(PlayerLoopTiming.LastFixedUpdate));
|
||||||
// PreUpdate
|
// PreUpdate
|
||||||
copyList[3].subSystemList = InsertRunner(copyList[3], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreUpdate), yielders[6] = new ContinuationQueue(PlayerLoopTiming.PreUpdate),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PreUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreUpdate), yielders[6] = new ContinuationQueue(PlayerLoopTiming.PreUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreUpdate), yielders[7] = new ContinuationQueue(PlayerLoopTiming.LastPreUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreUpdate), yielders[7] = new ContinuationQueue(PlayerLoopTiming.LastPreUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreUpdate), runners[6] = new PlayerLoopRunner(PlayerLoopTiming.PreUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreUpdate), runners[6] = new PlayerLoopRunner(PlayerLoopTiming.PreUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreUpdate), runners[7] = new PlayerLoopRunner(PlayerLoopTiming.LastPreUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreUpdate), runners[7] = new PlayerLoopRunner(PlayerLoopTiming.LastPreUpdate));
|
||||||
// Update
|
// Update
|
||||||
copyList[4].subSystemList = InsertRunner(copyList[4], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldUpdate), yielders[8] = new ContinuationQueue(PlayerLoopTiming.Update),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldUpdate), yielders[8] = new ContinuationQueue(PlayerLoopTiming.Update),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldUpdate), yielders[9] = new ContinuationQueue(PlayerLoopTiming.LastUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldUpdate), yielders[9] = new ContinuationQueue(PlayerLoopTiming.LastUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerUpdate), runners[8] = new PlayerLoopRunner(PlayerLoopTiming.Update),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerUpdate), runners[8] = new PlayerLoopRunner(PlayerLoopTiming.Update),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastUpdate), runners[9] = new PlayerLoopRunner(PlayerLoopTiming.LastUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastUpdate), runners[9] = new PlayerLoopRunner(PlayerLoopTiming.LastUpdate));
|
||||||
// PreLateUpdate
|
// PreLateUpdate
|
||||||
copyList[5].subSystemList = InsertRunner(copyList[5], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreLateUpdate), yielders[10] = new ContinuationQueue(PlayerLoopTiming.PreLateUpdate),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PreLateUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreLateUpdate), yielders[10] = new ContinuationQueue(PlayerLoopTiming.PreLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreLateUpdate), yielders[11] = new ContinuationQueue(PlayerLoopTiming.LastPreLateUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreLateUpdate), yielders[11] = new ContinuationQueue(PlayerLoopTiming.LastPreLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreLateUpdate), runners[10] = new PlayerLoopRunner(PlayerLoopTiming.PreLateUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreLateUpdate), runners[10] = new PlayerLoopRunner(PlayerLoopTiming.PreLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreLateUpdate), runners[11] = new PlayerLoopRunner(PlayerLoopTiming.LastPreLateUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreLateUpdate), runners[11] = new PlayerLoopRunner(PlayerLoopTiming.LastPreLateUpdate));
|
||||||
// PostLateUpdate
|
// PostLateUpdate
|
||||||
copyList[6].subSystemList = InsertRunner(copyList[6], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPostLateUpdate), yielders[12] = new ContinuationQueue(PlayerLoopTiming.PostLateUpdate),
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PostLateUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPostLateUpdate), yielders[12] = new ContinuationQueue(PlayerLoopTiming.PostLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPostLateUpdate), yielders[13] = new ContinuationQueue(PlayerLoopTiming.LastPostLateUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPostLateUpdate), yielders[13] = new ContinuationQueue(PlayerLoopTiming.LastPostLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPostLateUpdate), runners[12] = new PlayerLoopRunner(PlayerLoopTiming.PostLateUpdate),
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerPostLateUpdate), runners[12] = new PlayerLoopRunner(PlayerLoopTiming.PostLateUpdate),
|
||||||
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPostLateUpdate), runners[13] = new PlayerLoopRunner(PlayerLoopTiming.LastPostLateUpdate));
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPostLateUpdate), runners[13] = new PlayerLoopRunner(PlayerLoopTiming.LastPostLateUpdate));
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
// TimeUpdate
|
||||||
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.TimeUpdate));
|
||||||
|
copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldTimeUpdate), yielders[14] = new ContinuationQueue(PlayerLoopTiming.TimeUpdate),
|
||||||
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldTimeUpdate), yielders[15] = new ContinuationQueue(PlayerLoopTiming.LastTimeUpdate),
|
||||||
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerTimeUpdate), runners[14] = new PlayerLoopRunner(PlayerLoopTiming.TimeUpdate),
|
||||||
|
typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastTimeUpdate), runners[15] = new PlayerLoopRunner(PlayerLoopTiming.LastTimeUpdate));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Insert UniTaskSynchronizationContext to Update loop
|
||||||
|
i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update));
|
||||||
|
copyList[i].subSystemList = InsertUniTaskSynchronizationContext(copyList[i]);
|
||||||
|
|
||||||
playerLoop.subSystemList = copyList;
|
playerLoop.subSystemList = copyList;
|
||||||
PlayerLoop.SetPlayerLoop(playerLoop);
|
PlayerLoop.SetPlayerLoop(playerLoop);
|
||||||
@@ -304,6 +390,56 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
yielders[(int)timing].Enqueue(continuation);
|
yielders[(int)timing].Enqueue(continuation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Diagnostics helper
|
||||||
|
|
||||||
|
#if UNITY_2019_3_OR_NEWER
|
||||||
|
|
||||||
|
public static void DumpCurrentPlayerLoop()
|
||||||
|
{
|
||||||
|
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
|
||||||
|
|
||||||
|
var sb = new System.Text.StringBuilder();
|
||||||
|
sb.AppendLine($"PlayerLoop List");
|
||||||
|
foreach (var header in playerLoop.subSystemList)
|
||||||
|
{
|
||||||
|
sb.AppendFormat("------{0}------", header.type.Name);
|
||||||
|
sb.AppendLine();
|
||||||
|
foreach (var subSystem in header.subSystemList)
|
||||||
|
{
|
||||||
|
sb.AppendFormat("{0}", subSystem.type.Name);
|
||||||
|
sb.AppendLine();
|
||||||
|
|
||||||
|
if (subSystem.subSystemList != null)
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.LogWarning("More Subsystem:" + subSystem.subSystemList.Length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UnityEngine.Debug.Log(sb.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool IsInjectedUniTaskPlayerLoop()
|
||||||
|
{
|
||||||
|
var playerLoop = UnityEngine.LowLevel.PlayerLoop.GetCurrentPlayerLoop();
|
||||||
|
|
||||||
|
foreach (var header in playerLoop.subSystemList)
|
||||||
|
{
|
||||||
|
foreach (var subSystem in header.subSystemList)
|
||||||
|
{
|
||||||
|
if (subSystem.type == typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
@@ -39,23 +41,28 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<(Type, int)> GetCacheSizeInfo()
|
public static IEnumerable<(Type, int)> GetCacheSizeInfo()
|
||||||
|
{
|
||||||
|
lock (sizes)
|
||||||
{
|
{
|
||||||
foreach (var item in sizes)
|
foreach (var item in sizes)
|
||||||
{
|
{
|
||||||
yield return (item.Key, item.Value());
|
yield return (item.Key, item.Value());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void RegisterSizeGetter(Type type, Func<int> getSize)
|
public static void RegisterSizeGetter(Type type, Func<int> getSize)
|
||||||
|
{
|
||||||
|
lock (sizes)
|
||||||
{
|
{
|
||||||
sizes[type] = getSize;
|
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);
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks.Triggers
|
namespace Cysharp.Threading.Tasks.Triggers
|
||||||
{
|
{
|
||||||
@@ -715,6 +717,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionEnter
|
#region CollisionEnter
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionEnterHandler
|
public interface IAsyncOnCollisionEnterHandler
|
||||||
{
|
{
|
||||||
@@ -771,9 +774,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionEnterHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionEnterAsync();
|
return ((IAsyncOnCollisionEnterHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionEnterAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionEnter2D
|
#region CollisionEnter2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionEnter2DHandler
|
public interface IAsyncOnCollisionEnter2DHandler
|
||||||
{
|
{
|
||||||
@@ -830,9 +835,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionEnter2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionEnter2DAsync();
|
return ((IAsyncOnCollisionEnter2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionEnter2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionExit
|
#region CollisionExit
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionExitHandler
|
public interface IAsyncOnCollisionExitHandler
|
||||||
{
|
{
|
||||||
@@ -889,9 +896,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionExitHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionExitAsync();
|
return ((IAsyncOnCollisionExitHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionExitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionExit2D
|
#region CollisionExit2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionExit2DHandler
|
public interface IAsyncOnCollisionExit2DHandler
|
||||||
{
|
{
|
||||||
@@ -948,9 +957,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionExit2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionExit2DAsync();
|
return ((IAsyncOnCollisionExit2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionExit2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionStay
|
#region CollisionStay
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionStayHandler
|
public interface IAsyncOnCollisionStayHandler
|
||||||
{
|
{
|
||||||
@@ -1007,9 +1018,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionStayHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionStayAsync();
|
return ((IAsyncOnCollisionStayHandler)new AsyncTriggerHandler<Collision>(this, cancellationToken, true)).OnCollisionStayAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region CollisionStay2D
|
#region CollisionStay2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCollisionStay2DHandler
|
public interface IAsyncOnCollisionStay2DHandler
|
||||||
{
|
{
|
||||||
@@ -1066,9 +1079,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCollisionStay2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionStay2DAsync();
|
return ((IAsyncOnCollisionStay2DHandler)new AsyncTriggerHandler<Collision2D>(this, cancellationToken, true)).OnCollisionStay2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ControllerColliderHit
|
#region ControllerColliderHit
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnControllerColliderHitHandler
|
public interface IAsyncOnControllerColliderHitHandler
|
||||||
{
|
{
|
||||||
@@ -1125,6 +1140,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnControllerColliderHitHandler)new AsyncTriggerHandler<ControllerColliderHit>(this, cancellationToken, true)).OnControllerColliderHitAsync();
|
return ((IAsyncOnControllerColliderHitHandler)new AsyncTriggerHandler<ControllerColliderHit>(this, cancellationToken, true)).OnControllerColliderHitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Disable
|
#region Disable
|
||||||
@@ -1423,6 +1439,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region JointBreak
|
#region JointBreak
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnJointBreakHandler
|
public interface IAsyncOnJointBreakHandler
|
||||||
{
|
{
|
||||||
@@ -1479,9 +1496,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnJointBreakHandler)new AsyncTriggerHandler<float>(this, cancellationToken, true)).OnJointBreakAsync();
|
return ((IAsyncOnJointBreakHandler)new AsyncTriggerHandler<float>(this, cancellationToken, true)).OnJointBreakAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region JointBreak2D
|
#region JointBreak2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnJointBreak2DHandler
|
public interface IAsyncOnJointBreak2DHandler
|
||||||
{
|
{
|
||||||
@@ -1538,9 +1557,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnJointBreak2DHandler)new AsyncTriggerHandler<Joint2D>(this, cancellationToken, true)).OnJointBreak2DAsync();
|
return ((IAsyncOnJointBreak2DHandler)new AsyncTriggerHandler<Joint2D>(this, cancellationToken, true)).OnJointBreak2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region MouseDown
|
#region MouseDown
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
|
||||||
public interface IAsyncOnMouseDownHandler
|
public interface IAsyncOnMouseDownHandler
|
||||||
{
|
{
|
||||||
@@ -1597,9 +1618,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 +1679,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 +1740,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 +1801,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 +1862,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 +1923,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 +1984,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
|
||||||
@@ -2131,7 +2165,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ParticleUpdateJobScheduled
|
#region ParticleUpdateJobScheduled
|
||||||
#if UNITY_2019_3_OR_NEWER
|
#if UNITY_2019_3_OR_NEWER && (!UNITY_2019_1_OR_NEWER || UNITASK_PARTICLESYSTEM_SUPPORT)
|
||||||
|
|
||||||
public interface IAsyncOnParticleUpdateJobScheduledHandler
|
public interface IAsyncOnParticleUpdateJobScheduledHandler
|
||||||
{
|
{
|
||||||
@@ -2782,6 +2816,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerEnter
|
#region TriggerEnter
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerEnterHandler
|
public interface IAsyncOnTriggerEnterHandler
|
||||||
{
|
{
|
||||||
@@ -2838,9 +2873,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerEnterHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerEnterAsync();
|
return ((IAsyncOnTriggerEnterHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerEnterAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerEnter2D
|
#region TriggerEnter2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerEnter2DHandler
|
public interface IAsyncOnTriggerEnter2DHandler
|
||||||
{
|
{
|
||||||
@@ -2897,9 +2934,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerEnter2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerEnter2DAsync();
|
return ((IAsyncOnTriggerEnter2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerEnter2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerExit
|
#region TriggerExit
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerExitHandler
|
public interface IAsyncOnTriggerExitHandler
|
||||||
{
|
{
|
||||||
@@ -2956,9 +2995,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerExitHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerExitAsync();
|
return ((IAsyncOnTriggerExitHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerExitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerExit2D
|
#region TriggerExit2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerExit2DHandler
|
public interface IAsyncOnTriggerExit2DHandler
|
||||||
{
|
{
|
||||||
@@ -3015,9 +3056,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerExit2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerExit2DAsync();
|
return ((IAsyncOnTriggerExit2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerExit2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerStay
|
#region TriggerStay
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerStayHandler
|
public interface IAsyncOnTriggerStayHandler
|
||||||
{
|
{
|
||||||
@@ -3074,9 +3117,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerStayHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerStayAsync();
|
return ((IAsyncOnTriggerStayHandler)new AsyncTriggerHandler<Collider>(this, cancellationToken, true)).OnTriggerStayAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region TriggerStay2D
|
#region TriggerStay2D
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_PHYSICS2D_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnTriggerStay2DHandler
|
public interface IAsyncOnTriggerStay2DHandler
|
||||||
{
|
{
|
||||||
@@ -3133,6 +3178,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnTriggerStay2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerStay2DAsync();
|
return ((IAsyncOnTriggerStay2DHandler)new AsyncTriggerHandler<Collider2D>(this, cancellationToken, true)).OnTriggerStay2DAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Validate
|
#region Validate
|
||||||
@@ -3372,6 +3418,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region BeginDrag
|
#region BeginDrag
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnBeginDragHandler
|
public interface IAsyncOnBeginDragHandler
|
||||||
{
|
{
|
||||||
@@ -3428,9 +3475,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnBeginDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnBeginDragAsync();
|
return ((IAsyncOnBeginDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnBeginDragAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Cancel
|
#region Cancel
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnCancelHandler
|
public interface IAsyncOnCancelHandler
|
||||||
{
|
{
|
||||||
@@ -3487,9 +3536,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnCancelHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnCancelAsync();
|
return ((IAsyncOnCancelHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnCancelAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Deselect
|
#region Deselect
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnDeselectHandler
|
public interface IAsyncOnDeselectHandler
|
||||||
{
|
{
|
||||||
@@ -3546,9 +3597,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnDeselectHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnDeselectAsync();
|
return ((IAsyncOnDeselectHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnDeselectAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Drag
|
#region Drag
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnDragHandler
|
public interface IAsyncOnDragHandler
|
||||||
{
|
{
|
||||||
@@ -3605,9 +3658,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnDragAsync();
|
return ((IAsyncOnDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnDragAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Drop
|
#region Drop
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnDropHandler
|
public interface IAsyncOnDropHandler
|
||||||
{
|
{
|
||||||
@@ -3664,9 +3719,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnDropHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnDropAsync();
|
return ((IAsyncOnDropHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnDropAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region EndDrag
|
#region EndDrag
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnEndDragHandler
|
public interface IAsyncOnEndDragHandler
|
||||||
{
|
{
|
||||||
@@ -3723,9 +3780,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnEndDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnEndDragAsync();
|
return ((IAsyncOnEndDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnEndDragAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region InitializePotentialDrag
|
#region InitializePotentialDrag
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnInitializePotentialDragHandler
|
public interface IAsyncOnInitializePotentialDragHandler
|
||||||
{
|
{
|
||||||
@@ -3782,9 +3841,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnInitializePotentialDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnInitializePotentialDragAsync();
|
return ((IAsyncOnInitializePotentialDragHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnInitializePotentialDragAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Move
|
#region Move
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnMoveHandler
|
public interface IAsyncOnMoveHandler
|
||||||
{
|
{
|
||||||
@@ -3841,9 +3902,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnMoveHandler)new AsyncTriggerHandler<AxisEventData>(this, cancellationToken, true)).OnMoveAsync();
|
return ((IAsyncOnMoveHandler)new AsyncTriggerHandler<AxisEventData>(this, cancellationToken, true)).OnMoveAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PointerClick
|
#region PointerClick
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnPointerClickHandler
|
public interface IAsyncOnPointerClickHandler
|
||||||
{
|
{
|
||||||
@@ -3900,9 +3963,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnPointerClickHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerClickAsync();
|
return ((IAsyncOnPointerClickHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerClickAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PointerDown
|
#region PointerDown
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnPointerDownHandler
|
public interface IAsyncOnPointerDownHandler
|
||||||
{
|
{
|
||||||
@@ -3959,9 +4024,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnPointerDownHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerDownAsync();
|
return ((IAsyncOnPointerDownHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerDownAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PointerEnter
|
#region PointerEnter
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnPointerEnterHandler
|
public interface IAsyncOnPointerEnterHandler
|
||||||
{
|
{
|
||||||
@@ -4018,9 +4085,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnPointerEnterHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerEnterAsync();
|
return ((IAsyncOnPointerEnterHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerEnterAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PointerExit
|
#region PointerExit
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnPointerExitHandler
|
public interface IAsyncOnPointerExitHandler
|
||||||
{
|
{
|
||||||
@@ -4077,9 +4146,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnPointerExitHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerExitAsync();
|
return ((IAsyncOnPointerExitHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerExitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region PointerUp
|
#region PointerUp
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnPointerUpHandler
|
public interface IAsyncOnPointerUpHandler
|
||||||
{
|
{
|
||||||
@@ -4136,9 +4207,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnPointerUpHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerUpAsync();
|
return ((IAsyncOnPointerUpHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnPointerUpAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Scroll
|
#region Scroll
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnScrollHandler
|
public interface IAsyncOnScrollHandler
|
||||||
{
|
{
|
||||||
@@ -4195,9 +4268,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnScrollHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnScrollAsync();
|
return ((IAsyncOnScrollHandler)new AsyncTriggerHandler<PointerEventData>(this, cancellationToken, true)).OnScrollAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Select
|
#region Select
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnSelectHandler
|
public interface IAsyncOnSelectHandler
|
||||||
{
|
{
|
||||||
@@ -4254,9 +4329,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnSelectHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnSelectAsync();
|
return ((IAsyncOnSelectHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnSelectAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Submit
|
#region Submit
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnSubmitHandler
|
public interface IAsyncOnSubmitHandler
|
||||||
{
|
{
|
||||||
@@ -4313,9 +4390,11 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnSubmitHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnSubmitAsync();
|
return ((IAsyncOnSubmitHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnSubmitAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region UpdateSelected
|
#region UpdateSelected
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
|
||||||
public interface IAsyncOnUpdateSelectedHandler
|
public interface IAsyncOnUpdateSelectedHandler
|
||||||
{
|
{
|
||||||
@@ -4372,6 +4451,7 @@ namespace Cysharp.Threading.Tasks.Triggers
|
|||||||
return ((IAsyncOnUpdateSelectedHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnUpdateSelectedAsync();
|
return ((IAsyncOnUpdateSelectedHandler)new AsyncTriggerHandler<BaseEventData>(this, cancellationToken, true)).OnUpdateSelectedAsync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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") }),
|
||||||
@@ -103,20 +106,36 @@
|
|||||||
Func<(string argType, string argName)[], string> BuildMethodArgument = x => string.Join(", ", x.Select(y => y.argType + " " + y.argName));
|
Func<(string argType, string argName)[], string> BuildMethodArgument = x => string.Join(", ", x.Select(y => y.argType + " " + y.argName));
|
||||||
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> IsParticleSystem = x => x == "ParticleUpdateJobScheduled";
|
||||||
|
Func<string, bool> IsMouseTrigger = x => x.StartsWith("Mouse");
|
||||||
|
Func<string, string> RequirePhysicsModule = x => (x.StartsWith("Collision") || x.StartsWith("Collider") || x.StartsWith("ControllerCollider") || x.StartsWith("Joint") || x.StartsWith("Trigger"))
|
||||||
|
? (x.Contains("2D") ? "UNITASK_PHYSICS2D_SUPPORT" : "UNITASK_PHYSICS_SUPPORT")
|
||||||
|
: null;
|
||||||
|
Func<string, bool> IsUguiSystem = x => x != null;
|
||||||
#>
|
#>
|
||||||
#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
|
||||||
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
using UnityEngine.EventSystems;
|
using UnityEngine.EventSystems;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks.Triggers
|
namespace Cysharp.Threading.Tasks.Triggers
|
||||||
{
|
{
|
||||||
<# foreach(var t in triggers) { #>
|
<# foreach(var t in triggers) { #>
|
||||||
#region <#= t.triggerName #>
|
#region <#= t.triggerName #>
|
||||||
<# if(Is2019_3(t.triggerName)) { #>
|
<# if(IsUguiSystem(t.handlerInterface)) { #>
|
||||||
#if UNITY_2019_3_OR_NEWER
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
|
<# } #>
|
||||||
|
<# if(IsParticleSystem(t.triggerName)) { #>
|
||||||
|
#if UNITY_2019_3_OR_NEWER && (!UNITY_2019_1_OR_NEWER || UNITASK_PARTICLESYSTEM_SUPPORT)
|
||||||
|
<# } #>
|
||||||
|
<# if(IsMouseTrigger(t.triggerName)) { #>
|
||||||
|
#if !(UNITY_IPHONE || UNITY_ANDROID || UNITY_METRO)
|
||||||
|
<# } #>
|
||||||
|
<# if(RequirePhysicsModule(t.triggerName) != null) { #>
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || <#= RequirePhysicsModule(t.triggerName) #>
|
||||||
<# } #>
|
<# } #>
|
||||||
|
|
||||||
public interface <#= ToInterfaceName(t.methodName) #>
|
public interface <#= ToInterfaceName(t.methodName) #>
|
||||||
@@ -174,7 +193,13 @@ 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(IsUguiSystem(t.handlerInterface)) { #>
|
||||||
|
#endif
|
||||||
|
<# } #>
|
||||||
|
<# if(RequirePhysicsModule(t.triggerName) != null) { #>
|
||||||
|
#endif
|
||||||
|
<# } #>
|
||||||
|
<# if(IsParticleSystem(t.triggerName) || IsMouseTrigger(t.triggerName)) { #>
|
||||||
#endif
|
#endif
|
||||||
<# } #>
|
<# } #>
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#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
|
||||||
|
|
||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -7,6 +8,16 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
{
|
{
|
||||||
|
public enum DelayType
|
||||||
|
{
|
||||||
|
/// <summary>use Time.deltaTime.</summary>
|
||||||
|
DeltaTime,
|
||||||
|
/// <summary>Ignore timescale, use Time.unscaledDeltaTime.</summary>
|
||||||
|
UnscaledDeltaTime,
|
||||||
|
/// <summary>use Stopwatch.GetTimestamp().</summary>
|
||||||
|
Realtime
|
||||||
|
}
|
||||||
|
|
||||||
public partial struct UniTask
|
public partial struct UniTask
|
||||||
{
|
{
|
||||||
public static YieldAwaitable Yield(PlayerLoopTiming timing = PlayerLoopTiming.Update)
|
public static YieldAwaitable Yield(PlayerLoopTiming timing = PlayerLoopTiming.Update)
|
||||||
@@ -73,32 +84,51 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);
|
var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);
|
||||||
if (delayTimeSpan < TimeSpan.Zero)
|
return Delay(delayTimeSpan, ignoreTimeScale, delayTiming, cancellationToken);
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException("Delay does not allow minus millisecondsDelay. millisecondsDelay:" + millisecondsDelay);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ignoreTimeScale)
|
|
||||||
? new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token)
|
|
||||||
: new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out token), token);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
var delayType = ignoreTimeScale ? DelayType.UnscaledDeltaTime : DelayType.DeltaTime;
|
||||||
|
return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask Delay(int millisecondsDelay, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);
|
||||||
|
return Delay(delayTimeSpan, delayType, delayTiming, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask Delay(TimeSpan delayTimeSpan, DelayType delayType, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
if (delayTimeSpan < TimeSpan.Zero)
|
if (delayTimeSpan < TimeSpan.Zero)
|
||||||
{
|
{
|
||||||
throw new ArgumentOutOfRangeException("Delay does not allow minus delayTimeSpan. delayTimeSpan:" + delayTimeSpan);
|
throw new ArgumentOutOfRangeException("Delay does not allow minus delayTimeSpan. delayTimeSpan:" + delayTimeSpan);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ignoreTimeScale)
|
switch (delayType)
|
||||||
? new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token)
|
{
|
||||||
: new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out token), token);
|
case DelayType.UnscaledDeltaTime:
|
||||||
|
{
|
||||||
|
return new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
case DelayType.Realtime:
|
||||||
|
{
|
||||||
|
return new UniTask(DelayRealtimePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
case DelayType.DeltaTime:
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -181,20 +211,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~YieldPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -221,7 +244,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
result = new NextFramePromise();
|
result = new NextFramePromise();
|
||||||
}
|
}
|
||||||
|
|
||||||
result.frameCount = Time.frameCount;
|
result.frameCount = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
@@ -283,20 +306,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~NextFramePromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -328,7 +344,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
result.delayFrameCount = delayFrameCount;
|
result.delayFrameCount = delayFrameCount;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
result.initialFrame = Time.frameCount;
|
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
@@ -406,20 +422,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~DelayFramePromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -427,7 +436,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
int initialFrame;
|
int initialFrame;
|
||||||
float delayFrameTimeSpan;
|
float delayTimeSpan;
|
||||||
float elapsed;
|
float elapsed;
|
||||||
CancellationToken cancellationToken;
|
CancellationToken cancellationToken;
|
||||||
|
|
||||||
@@ -437,7 +446,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IUniTaskSource Create(TimeSpan delayFrameTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
|
public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
|
||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
@@ -450,9 +459,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
result.elapsed = 0.0f;
|
result.elapsed = 0.0f;
|
||||||
result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds;
|
result.delayTimeSpan = (float)delayTimeSpan.TotalSeconds;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
result.initialFrame = Time.frameCount;
|
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
@@ -506,7 +515,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
elapsed += Time.deltaTime;
|
elapsed += Time.deltaTime;
|
||||||
if (elapsed >= delayFrameTimeSpan)
|
if (elapsed >= delayTimeSpan)
|
||||||
{
|
{
|
||||||
core.TrySetResult(null);
|
core.TrySetResult(null);
|
||||||
return false;
|
return false;
|
||||||
@@ -519,25 +528,18 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
core.Reset();
|
core.Reset();
|
||||||
delayFrameTimeSpan = default;
|
delayTimeSpan = default;
|
||||||
elapsed = default;
|
elapsed = default;
|
||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~DelayPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -569,7 +571,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
result.elapsed = 0.0f;
|
result.elapsed = 0.0f;
|
||||||
result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds;
|
result.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds;
|
||||||
result.initialFrame = Time.frameCount;
|
result.initialFrame = PlayerLoopHelper.IsMainThread ? Time.frameCount : -1;
|
||||||
result.cancellationToken = cancellationToken;
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
TaskTracker.TrackActiveTask(result, 3);
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
@@ -642,13 +644,110 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~DelayIgnoreTimeScalePromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class DelayRealtimePromise : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<DelayRealtimePromise>
|
||||||
|
{
|
||||||
|
static TaskPool<DelayRealtimePromise> pool;
|
||||||
|
DelayRealtimePromise nextNode;
|
||||||
|
public ref DelayRealtimePromise NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static DelayRealtimePromise()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(DelayRealtimePromise), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
long delayTimeSpanTicks;
|
||||||
|
ValueStopwatch stopwatch;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
|
DelayRealtimePromise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource Create(TimeSpan delayTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new DelayRealtimePromise();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.stopwatch = ValueStopwatch.StartNew();
|
||||||
|
result.delayTimeSpanTicks = delayTimeSpan.Ticks;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
core.GetResult(token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stopwatch.IsInvalid)
|
||||||
|
{
|
||||||
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stopwatch.ElapsedTicks >= delayTimeSpanTicks)
|
||||||
|
{
|
||||||
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
stopwatch = default;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
using Cysharp.Threading.Tasks.Internal;
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.ExceptionServices;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
@@ -11,10 +12,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
static readonly UniTask CanceledUniTask = new Func<UniTask>(() =>
|
static readonly UniTask CanceledUniTask = new Func<UniTask>(() =>
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource();
|
return new UniTask(new CanceledResultSource(CancellationToken.None), 0);
|
||||||
promise.TrySetCanceled(CancellationToken.None);
|
|
||||||
promise.MarkHandled();
|
|
||||||
return promise.Task;
|
|
||||||
})();
|
})();
|
||||||
|
|
||||||
static class CanceledUniTaskCache<T>
|
static class CanceledUniTaskCache<T>
|
||||||
@@ -23,10 +21,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
static CanceledUniTaskCache()
|
static CanceledUniTaskCache()
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource<T>();
|
Task = new UniTask<T>(new CanceledResultSource<T>(CancellationToken.None), 0);
|
||||||
promise.TrySetCanceled(CancellationToken.None);
|
|
||||||
promise.MarkHandled();
|
|
||||||
Task = promise.Task;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,18 +29,22 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public static UniTask FromException(Exception ex)
|
public static UniTask FromException(Exception ex)
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource();
|
if (ex is OperationCanceledException oce)
|
||||||
promise.TrySetException(ex);
|
{
|
||||||
promise.MarkHandled();
|
return FromCanceled(oce.CancellationToken);
|
||||||
return promise.Task;
|
}
|
||||||
|
|
||||||
|
return new UniTask(new ExceptionResultSource(ex), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<T> FromException<T>(Exception ex)
|
public static UniTask<T> FromException<T>(Exception ex)
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource<T>();
|
if (ex is OperationCanceledException oce)
|
||||||
promise.TrySetException(ex);
|
{
|
||||||
promise.MarkHandled();
|
return FromCanceled<T>(oce.CancellationToken);
|
||||||
return promise.Task;
|
}
|
||||||
|
|
||||||
|
return new UniTask<T>(new ExceptionResultSource<T>(ex), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<T> FromResult<T>(T value)
|
public static UniTask<T> FromResult<T>(T value)
|
||||||
@@ -61,10 +60,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource();
|
return new UniTask(new CanceledResultSource(cancellationToken), 0);
|
||||||
promise.TrySetCanceled(cancellationToken);
|
|
||||||
promise.MarkHandled();
|
|
||||||
return promise.Task;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,10 +72,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var promise = new UniTaskCompletionSource<T>();
|
return new UniTask<T>(new CanceledResultSource<T>(cancellationToken), 0);
|
||||||
promise.TrySetCanceled(cancellationToken);
|
|
||||||
promise.MarkHandled();
|
|
||||||
return promise.Task;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +175,153 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return new UniTask<T>(new DeferPromise<T>(factory), 0);
|
return new UniTask<T>(new DeferPromise<T>(factory), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Never complete.
|
||||||
|
/// </summary>
|
||||||
|
public static UniTask Never(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UniTask<AsyncUnit>(new NeverPromise<AsyncUnit>(cancellationToken), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Never complete.
|
||||||
|
/// </summary>
|
||||||
|
public static UniTask<T> Never<T>(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return new UniTask<T>(new NeverPromise<T>(cancellationToken), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class ExceptionResultSource : IUniTaskSource
|
||||||
|
{
|
||||||
|
readonly ExceptionDispatchInfo exception;
|
||||||
|
|
||||||
|
public ExceptionResultSource(Exception exception)
|
||||||
|
{
|
||||||
|
this.exception = ExceptionDispatchInfo.Capture(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
exception.Throw();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Faulted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Faulted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class ExceptionResultSource<T> : IUniTaskSource<T>
|
||||||
|
{
|
||||||
|
readonly ExceptionDispatchInfo exception;
|
||||||
|
|
||||||
|
public ExceptionResultSource(Exception exception)
|
||||||
|
{
|
||||||
|
this.exception = ExceptionDispatchInfo.Capture(exception);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
exception.Throw();
|
||||||
|
return default;
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
exception.Throw();
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Faulted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Faulted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class CanceledResultSource : IUniTaskSource
|
||||||
|
{
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
public CanceledResultSource(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
throw new OperationCanceledException(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Canceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Canceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class CanceledResultSource<T> : IUniTaskSource<T>
|
||||||
|
{
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
public CanceledResultSource(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
throw new OperationCanceledException(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
throw new OperationCanceledException(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Canceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return UniTaskStatus.Canceled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sealed class DeferPromise : IUniTaskSource
|
sealed class DeferPromise : IUniTaskSource
|
||||||
{
|
{
|
||||||
Func<UniTask> factory;
|
Func<UniTask> factory;
|
||||||
@@ -201,10 +341,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public UniTaskStatus GetStatus(short token)
|
public UniTaskStatus GetStatus(short token)
|
||||||
{
|
{
|
||||||
var f = Interlocked.Exchange(ref factory, null);
|
var f = Interlocked.Exchange(ref factory, null);
|
||||||
if (f == null) throw new InvalidOperationException("Can't call twice.");
|
if (f != null)
|
||||||
|
{
|
||||||
task = f();
|
task = f();
|
||||||
awaiter = task.GetAwaiter();
|
awaiter = task.GetAwaiter();
|
||||||
|
}
|
||||||
|
|
||||||
return task.Status;
|
return task.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -243,10 +385,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public UniTaskStatus GetStatus(short token)
|
public UniTaskStatus GetStatus(short token)
|
||||||
{
|
{
|
||||||
var f = Interlocked.Exchange(ref factory, null);
|
var f = Interlocked.Exchange(ref factory, null);
|
||||||
if (f == null) throw new InvalidOperationException("Can't call twice.");
|
if (f != null)
|
||||||
|
{
|
||||||
task = f();
|
task = f();
|
||||||
awaiter = task.GetAwaiter();
|
awaiter = task.GetAwaiter();
|
||||||
|
}
|
||||||
|
|
||||||
return task.Status;
|
return task.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -260,6 +404,54 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return task.Status;
|
return task.Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sealed class NeverPromise<T> : IUniTaskSource<T>
|
||||||
|
{
|
||||||
|
static readonly Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
|
public NeverPromise(CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
if (this.cancellationToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
this.cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CancellationCallback(object state)
|
||||||
|
{
|
||||||
|
var self = (NeverPromise<T>)state;
|
||||||
|
self.core.TrySetCanceled(self.cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
core.GetResult(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static class CompletedTasks
|
internal static class CompletedTasks
|
||||||
|
|||||||
@@ -1,16 +1,25 @@
|
|||||||
#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
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
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
|
||||||
public static async UniTask Run(Action action, bool configureAwait = true)
|
|
||||||
|
// 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)
|
||||||
{
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
await UniTask.SwitchToThreadPool();
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (configureAwait)
|
if (configureAwait)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -26,13 +35,19 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
action();
|
action();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
public static async UniTask Run(Action<object> action, object state, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
await UniTask.SwitchToThreadPool();
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (configureAwait)
|
if (configureAwait)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -48,12 +63,75 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
action(state);
|
action(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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)
|
public static async UniTask Run(Func<UniTask> action, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
await UniTask.SwitchToThreadPool();
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await action();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await action();
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
if (configureAwait)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await action(state);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
await UniTask.Yield();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await action(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <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)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (configureAwait)
|
if (configureAwait)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -63,6 +141,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await UniTask.Yield();
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -71,11 +150,45 @@ 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)
|
public static async UniTask<T> Run<T>(Func<UniTask<T>> func, bool configureAwait = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
await UniTask.SwitchToThreadPool();
|
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>[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)
|
||||||
|
{
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
await UniTask.SwitchToThreadPool();
|
||||||
|
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
if (configureAwait)
|
if (configureAwait)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -85,6 +198,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
await UniTask.Yield();
|
await UniTask.Yield();
|
||||||
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -92,6 +206,265 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return func(state);
|
return func(state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <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)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,33 +15,41 @@ namespace Cysharp.Threading.Tasks
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(PlayerLoopTiming.Update).
|
/// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(PlayerLoopTiming.Update).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static SwitchToMainThreadAwaitable SwitchToMainThread()
|
public static SwitchToMainThreadAwaitable SwitchToMainThread(CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new SwitchToMainThreadAwaitable(PlayerLoopTiming.Update);
|
return new SwitchToMainThreadAwaitable(PlayerLoopTiming.Update, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(timing).
|
/// If running on mainthread, do nothing. Otherwise, same as UniTask.Yield(timing).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static SwitchToMainThreadAwaitable SwitchToMainThread(PlayerLoopTiming timing)
|
public static SwitchToMainThreadAwaitable SwitchToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new SwitchToMainThreadAwaitable(timing);
|
return new SwitchToMainThreadAwaitable(timing, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.
|
/// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static ReturnToMainThread ReturnToMainThread()
|
public static ReturnToMainThread ReturnToMainThread(CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new ReturnToMainThread(PlayerLoopTiming.Update);
|
return new ReturnToMainThread(PlayerLoopTiming.Update, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.
|
/// Return to mainthread(same as await SwitchToMainThread) after using scope is closed.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static ReturnToMainThread ReturnToMainThread(PlayerLoopTiming timing)
|
public static ReturnToMainThread ReturnToMainThread(PlayerLoopTiming timing, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new ReturnToMainThread(timing);
|
return new ReturnToMainThread(timing, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Queue the action to PlayerLoop.
|
||||||
|
/// </summary>
|
||||||
|
public static void Post(Action action, PlayerLoopTiming timing = PlayerLoopTiming.Update)
|
||||||
|
{
|
||||||
|
PlayerLoopHelper.AddContinuation(timing, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -59,20 +67,20 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return new SwitchToTaskPoolAwaitable();
|
return new SwitchToTaskPoolAwaitable();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SwitchToSynchronizationContextAwaitable SwitchToSynchronizationContext(SynchronizationContext synchronizationContext)
|
public static SwitchToSynchronizationContextAwaitable SwitchToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(synchronizationContext, nameof(synchronizationContext));
|
Error.ThrowArgumentNullException(synchronizationContext, nameof(synchronizationContext));
|
||||||
return new SwitchToSynchronizationContextAwaitable(synchronizationContext);
|
return new SwitchToSynchronizationContextAwaitable(synchronizationContext, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ReturnToSynchronizationContext ReturnToSynchronizationContext(SynchronizationContext synchronizationContext)
|
public static ReturnToSynchronizationContext ReturnToSynchronizationContext(SynchronizationContext synchronizationContext, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new ReturnToSynchronizationContext(synchronizationContext, false);
|
return new ReturnToSynchronizationContext(synchronizationContext, false, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ReturnToSynchronizationContext ReturnToCurrentSynchronizationContext(bool dontPostWhenSameContext = true)
|
public static ReturnToSynchronizationContext ReturnToCurrentSynchronizationContext(bool dontPostWhenSameContext = true, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
return new ReturnToSynchronizationContext(SynchronizationContext.Current, dontPostWhenSameContext);
|
return new ReturnToSynchronizationContext(SynchronizationContext.Current, dontPostWhenSameContext, cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,21 +89,25 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public struct SwitchToMainThreadAwaitable
|
public struct SwitchToMainThreadAwaitable
|
||||||
{
|
{
|
||||||
readonly PlayerLoopTiming playerLoopTiming;
|
readonly PlayerLoopTiming playerLoopTiming;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public SwitchToMainThreadAwaitable(PlayerLoopTiming playerLoopTiming)
|
public SwitchToMainThreadAwaitable(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.playerLoopTiming = playerLoopTiming;
|
this.playerLoopTiming = playerLoopTiming;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter GetAwaiter() => new Awaiter(playerLoopTiming);
|
public Awaiter GetAwaiter() => new Awaiter(playerLoopTiming, cancellationToken);
|
||||||
|
|
||||||
public struct Awaiter : ICriticalNotifyCompletion
|
public struct Awaiter : ICriticalNotifyCompletion
|
||||||
{
|
{
|
||||||
readonly PlayerLoopTiming playerLoopTiming;
|
readonly PlayerLoopTiming playerLoopTiming;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public Awaiter(PlayerLoopTiming playerLoopTiming)
|
public Awaiter(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.playerLoopTiming = playerLoopTiming;
|
this.playerLoopTiming = playerLoopTiming;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsCompleted
|
public bool IsCompleted
|
||||||
@@ -114,7 +126,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetResult() { }
|
public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }
|
||||||
|
|
||||||
public void OnCompleted(Action continuation)
|
public void OnCompleted(Action continuation)
|
||||||
{
|
{
|
||||||
@@ -131,31 +143,35 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public struct ReturnToMainThread
|
public struct ReturnToMainThread
|
||||||
{
|
{
|
||||||
readonly PlayerLoopTiming playerLoopTiming;
|
readonly PlayerLoopTiming playerLoopTiming;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public ReturnToMainThread(PlayerLoopTiming playerLoopTiming)
|
public ReturnToMainThread(PlayerLoopTiming playerLoopTiming, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.playerLoopTiming = playerLoopTiming;
|
this.playerLoopTiming = playerLoopTiming;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter DisposeAsync()
|
public Awaiter DisposeAsync()
|
||||||
{
|
{
|
||||||
return new Awaiter(playerLoopTiming); // run immediate.
|
return new Awaiter(playerLoopTiming, cancellationToken); // run immediate.
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly struct Awaiter : ICriticalNotifyCompletion
|
public readonly struct Awaiter : ICriticalNotifyCompletion
|
||||||
{
|
{
|
||||||
readonly PlayerLoopTiming timing;
|
readonly PlayerLoopTiming timing;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public Awaiter(PlayerLoopTiming timing)
|
public Awaiter(PlayerLoopTiming timing, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.timing = timing;
|
this.timing = timing;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter GetAwaiter() => this;
|
public Awaiter GetAwaiter() => this;
|
||||||
|
|
||||||
public bool IsCompleted => PlayerLoopHelper.MainThreadId == System.Threading.Thread.CurrentThread.ManagedThreadId;
|
public bool IsCompleted => PlayerLoopHelper.MainThreadId == System.Threading.Thread.CurrentThread.ManagedThreadId;
|
||||||
|
|
||||||
public void GetResult() { }
|
public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }
|
||||||
|
|
||||||
public void OnCompleted(Action continuation)
|
public void OnCompleted(Action continuation)
|
||||||
{
|
{
|
||||||
@@ -208,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()
|
||||||
{
|
{
|
||||||
@@ -277,26 +294,30 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public struct SwitchToSynchronizationContextAwaitable
|
public struct SwitchToSynchronizationContextAwaitable
|
||||||
{
|
{
|
||||||
readonly SynchronizationContext synchronizationContext;
|
readonly SynchronizationContext synchronizationContext;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public SwitchToSynchronizationContextAwaitable(SynchronizationContext synchronizationContext)
|
public SwitchToSynchronizationContextAwaitable(SynchronizationContext synchronizationContext, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.synchronizationContext = synchronizationContext;
|
this.synchronizationContext = synchronizationContext;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter GetAwaiter() => new Awaiter(synchronizationContext);
|
public Awaiter GetAwaiter() => new Awaiter(synchronizationContext, cancellationToken);
|
||||||
|
|
||||||
public struct Awaiter : ICriticalNotifyCompletion
|
public struct Awaiter : ICriticalNotifyCompletion
|
||||||
{
|
{
|
||||||
static readonly SendOrPostCallback switchToCallback = Callback;
|
static readonly SendOrPostCallback switchToCallback = Callback;
|
||||||
readonly SynchronizationContext synchronizationContext;
|
readonly SynchronizationContext synchronizationContext;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public Awaiter(SynchronizationContext synchronizationContext)
|
public Awaiter(SynchronizationContext synchronizationContext, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.synchronizationContext = synchronizationContext;
|
this.synchronizationContext = synchronizationContext;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsCompleted => false;
|
public bool IsCompleted => false;
|
||||||
public void GetResult() { }
|
public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }
|
||||||
|
|
||||||
public void OnCompleted(Action continuation)
|
public void OnCompleted(Action continuation)
|
||||||
{
|
{
|
||||||
@@ -320,16 +341,18 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
readonly SynchronizationContext syncContext;
|
readonly SynchronizationContext syncContext;
|
||||||
readonly bool dontPostWhenSameContext;
|
readonly bool dontPostWhenSameContext;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public ReturnToSynchronizationContext(SynchronizationContext syncContext, bool dontPostWhenSameContext)
|
public ReturnToSynchronizationContext(SynchronizationContext syncContext, bool dontPostWhenSameContext, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.syncContext = syncContext;
|
this.syncContext = syncContext;
|
||||||
this.dontPostWhenSameContext = dontPostWhenSameContext;
|
this.dontPostWhenSameContext = dontPostWhenSameContext;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter DisposeAsync()
|
public Awaiter DisposeAsync()
|
||||||
{
|
{
|
||||||
return new Awaiter(syncContext, dontPostWhenSameContext);
|
return new Awaiter(syncContext, dontPostWhenSameContext, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct Awaiter : ICriticalNotifyCompletion
|
public struct Awaiter : ICriticalNotifyCompletion
|
||||||
@@ -338,11 +361,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
readonly SynchronizationContext synchronizationContext;
|
readonly SynchronizationContext synchronizationContext;
|
||||||
readonly bool dontPostWhenSameContext;
|
readonly bool dontPostWhenSameContext;
|
||||||
|
readonly CancellationToken cancellationToken;
|
||||||
|
|
||||||
public Awaiter(SynchronizationContext synchronizationContext, bool dontPostWhenSameContext)
|
public Awaiter(SynchronizationContext synchronizationContext, bool dontPostWhenSameContext, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
this.synchronizationContext = synchronizationContext;
|
this.synchronizationContext = synchronizationContext;
|
||||||
this.dontPostWhenSameContext = dontPostWhenSameContext;
|
this.dontPostWhenSameContext = dontPostWhenSameContext;
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Awaiter GetAwaiter() => this;
|
public Awaiter GetAwaiter() => this;
|
||||||
@@ -365,7 +390,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetResult() { }
|
public void GetResult() { cancellationToken.ThrowIfCancellationRequested(); }
|
||||||
|
|
||||||
public void OnCompleted(Action continuation)
|
public void OnCompleted(Action continuation)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
@@ -137,20 +138,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WaitUntilPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -249,20 +243,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WaitWhilePromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -344,21 +331,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WaitUntilCanceledPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// where T : UnityEngine.Object, can not add constraint
|
// where T : UnityEngine.Object, can not add constraint
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -475,21 +455,14 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WaitUntilValueChangedUnityObjectPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class WaitUntilValueChangedStandardObjectPromise<T, U> : IUniTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedStandardObjectPromise<T, U>>
|
sealed class WaitUntilValueChangedStandardObjectPromise<T, U> : IUniTaskSource<U>, IPlayerLoopItem, ITaskPoolNode<WaitUntilValueChangedStandardObjectPromise<T, U>>
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -604,14 +577,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WaitUntilValueChangedStandardObjectPromise()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,11 +131,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3)> WhenAll<T1, T2, T3>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
public static UniTask<(T1, T2, T3)> WhenAll<T1, T2, T3>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
||||||
@@ -295,11 +290,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4)> WhenAll<T1, T2, T3, T4>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
public static UniTask<(T1, T2, T3, T4)> WhenAll<T1, T2, T3, T4>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
||||||
@@ -495,11 +485,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5)> WhenAll<T1, T2, T3, T4, T5>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
public static UniTask<(T1, T2, T3, T4, T5)> WhenAll<T1, T2, T3, T4, T5>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
||||||
@@ -731,11 +716,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6)> WhenAll<T1, T2, T3, T4, T5, T6>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
public static UniTask<(T1, T2, T3, T4, T5, T6)> WhenAll<T1, T2, T3, T4, T5, T6>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
||||||
@@ -1003,11 +983,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7)> WhenAll<T1, T2, T3, T4, T5, T6, T7>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7)> WhenAll<T1, T2, T3, T4, T5, T6, T7>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
||||||
@@ -1311,11 +1286,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
||||||
@@ -1655,11 +1625,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
||||||
@@ -2035,11 +2000,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
||||||
@@ -2451,11 +2411,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
||||||
@@ -2903,11 +2858,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
||||||
@@ -3391,11 +3341,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
||||||
@@ -3915,11 +3860,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
||||||
@@ -4475,11 +4415,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
public static UniTask<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)> WhenAll<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
||||||
@@ -5071,11 +5006,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -45,7 +45,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public WhenAllPromise(<#= args #>)
|
public WhenAllPromise(<#= args #>)
|
||||||
{
|
{
|
||||||
TaskTracker2.TrackActiveTask(this, 3);
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
|
|
||||||
this.completedCount = 0;
|
this.completedCount = 0;
|
||||||
<# for(var j = 1; j <= i; j++) { #>
|
<# for(var j = 1; j <= i; j++) { #>
|
||||||
@@ -92,7 +92,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public (<#= t #>) GetResult(short token)
|
public (<#= t #>) GetResult(short token)
|
||||||
{
|
{
|
||||||
TaskTracker2.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
return core.GetResult(token);
|
return core.GetResult(token);
|
||||||
}
|
}
|
||||||
@@ -116,11 +116,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
<# } #>
|
<# } #>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -142,11 +142,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class WhenAllPromise : IUniTaskSource
|
sealed class WhenAllPromise : IUniTaskSource
|
||||||
@@ -237,11 +232,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
core.OnCompleted(continuation, state, token);
|
core.OnCompleted(continuation, state, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAllPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,11 +127,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)> WhenAny<T1, T2, T3>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3)> WhenAny<T1, T2, T3>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3)
|
||||||
@@ -289,11 +284,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)> WhenAny<T1, T2, T3, T4>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4)> WhenAny<T1, T2, T3, T4>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4)
|
||||||
@@ -488,11 +478,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> WhenAny<T1, T2, T3, T4, T5>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5)> WhenAny<T1, T2, T3, T4, T5>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5)
|
||||||
@@ -724,11 +709,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> WhenAny<T1, T2, T3, T4, T5, T6>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6)> WhenAny<T1, T2, T3, T4, T5, T6>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6)
|
||||||
@@ -997,11 +977,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> WhenAny<T1, T2, T3, T4, T5, T6, T7>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7)> WhenAny<T1, T2, T3, T4, T5, T6, T7>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7)
|
||||||
@@ -1307,11 +1282,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8)
|
||||||
@@ -1654,11 +1624,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9)
|
||||||
@@ -2038,11 +2003,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10)
|
||||||
@@ -2459,11 +2419,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11)
|
||||||
@@ -2917,11 +2872,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12)
|
||||||
@@ -3412,11 +3362,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13)
|
||||||
@@ -3944,11 +3889,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14)
|
||||||
@@ -4513,11 +4453,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
public static UniTask<(int winArgumentIndex, T1 result1, T2 result2, T3 result3, T4 result4, T5 result5, T6 result6, T7 result7, T8 result8, T9 result9, T10 result10, T11 result11, T12 result12, T13 result13, T14 result14, T15 result15)> WhenAny<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(UniTask<T1> task1, UniTask<T2> task2, UniTask<T3> task3, UniTask<T4> task4, UniTask<T5> task5, UniTask<T6> task6, UniTask<T7> task7, UniTask<T8> task8, UniTask<T9> task9, UniTask<T10> task10, UniTask<T11> task11, UniTask<T12> task12, UniTask<T13> task13, UniTask<T14> task14, UniTask<T15> task15)
|
||||||
@@ -5119,11 +5054,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public WhenAnyPromise(<#= args #>)
|
public WhenAnyPromise(<#= args #>)
|
||||||
{
|
{
|
||||||
TaskTracker2.TrackActiveTask(this, 3);
|
TaskTracker.TrackActiveTask(this, 3);
|
||||||
|
|
||||||
this.completedCount = 0;
|
this.completedCount = 0;
|
||||||
<# for(var j = 1; j <= i; j++) { #>
|
<# for(var j = 1; j <= i; j++) { #>
|
||||||
@@ -86,7 +86,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public (int, <#= tBool #>) GetResult(short token)
|
public (int, <#= tBool #>) GetResult(short token)
|
||||||
{
|
{
|
||||||
TaskTracker2.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
GC.SuppressFinalize(this);
|
GC.SuppressFinalize(this);
|
||||||
return core.GetResult(token);
|
return core.GetResult(token);
|
||||||
}
|
}
|
||||||
@@ -110,11 +110,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<# } #>
|
<# } #>
|
||||||
|
|||||||
@@ -171,11 +171,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyLRPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -268,11 +263,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed class WhenAnyPromise : IUniTaskSource<int>
|
sealed class WhenAnyPromise : IUniTaskSource<int>
|
||||||
@@ -363,11 +353,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
GetResult(token);
|
GetResult(token);
|
||||||
}
|
}
|
||||||
|
|
||||||
~WhenAnyPromise()
|
|
||||||
{
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "UniTask",
|
"name": "UniTask",
|
||||||
"references": [
|
"rootNamespace": "",
|
||||||
"Unity.ResourceManager",
|
"references": [],
|
||||||
"Unity.TextMeshPro",
|
|
||||||
"DOTween.Modules"
|
|
||||||
],
|
|
||||||
"includePlatforms": [],
|
"includePlatforms": [],
|
||||||
"excludePlatforms": [],
|
"excludePlatforms": [],
|
||||||
"allowUnsafeCode": false,
|
"allowUnsafeCode": false,
|
||||||
@@ -14,19 +11,34 @@
|
|||||||
"defineConstraints": [],
|
"defineConstraints": [],
|
||||||
"versionDefines": [
|
"versionDefines": [
|
||||||
{
|
{
|
||||||
"name": "com.unity.addressables",
|
"name": "com.unity.modules.assetbundle",
|
||||||
"expression": "",
|
"expression": "",
|
||||||
"define": "UNITASK_ADDRESSABLE_SUPPORT"
|
"define": "UNITASK_ASSETBUNDLE_SUPPORT"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "com.unity.textmeshpro",
|
"name": "com.unity.modules.physics",
|
||||||
"expression": "",
|
"expression": "",
|
||||||
"define": "UNITASK_TEXTMESHPRO_SUPPORT"
|
"define": "UNITASK_PHYSICS_SUPPORT"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "com.demigiant.dotween",
|
"name": "com.unity.modules.physics2d",
|
||||||
"expression": "",
|
"expression": "",
|
||||||
"define": "UNITASK_DOTWEEN_SUPPORT"
|
"define": "UNITASK_PHYSICS2D_SUPPORT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com.unity.modules.particlesystem",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_PARTICLESYSTEM_SUPPORT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com.unity.ugui",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_UGUI_SUPPORT"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "com.unity.modules.unitywebrequestwww",
|
||||||
|
"expression": "",
|
||||||
|
"define": "UNITASK_WEBREQUEST_SUPPORT"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"noEngineReferences": false
|
"noEngineReferences": false
|
||||||
|
|||||||
@@ -115,8 +115,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
var status = this.source.GetStatus(this.token);
|
var status = this.source.GetStatus(this.token);
|
||||||
if (status.IsCompletedSuccessfully())
|
if (status.IsCompletedSuccessfully())
|
||||||
{
|
{
|
||||||
|
this.source.GetResult(this.token);
|
||||||
return CompletedTasks.AsyncUnit;
|
return CompletedTasks.AsyncUnit;
|
||||||
}
|
}
|
||||||
|
else if(this.source is IUniTaskSource<AsyncUnit> asyncUnitSource)
|
||||||
|
{
|
||||||
|
return new UniTask<AsyncUnit>(asyncUnitSource, this.token);
|
||||||
|
}
|
||||||
|
|
||||||
return new UniTask<AsyncUnit>(new AsyncUnitSource(this.source), this.token);
|
return new UniTask<AsyncUnit>(new AsyncUnitSource(this.source), this.token);
|
||||||
}
|
}
|
||||||
@@ -422,6 +427,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
var status = this.source.GetStatus(this.token);
|
var status = this.source.GetStatus(this.token);
|
||||||
if (status.IsCompletedSuccessfully())
|
if (status.IsCompletedSuccessfully())
|
||||||
{
|
{
|
||||||
|
this.source.GetResult(this.token);
|
||||||
return UniTask.CompletedTask;
|
return UniTask.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#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
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using System.Runtime.ExceptionServices;
|
using System.Runtime.ExceptionServices;
|
||||||
@@ -38,13 +39,42 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class ExceptionHolder
|
||||||
|
{
|
||||||
|
ExceptionDispatchInfo exception;
|
||||||
|
bool calledGet = false;
|
||||||
|
|
||||||
|
public ExceptionHolder(ExceptionDispatchInfo exception)
|
||||||
|
{
|
||||||
|
this.exception = exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ExceptionDispatchInfo GetException()
|
||||||
|
{
|
||||||
|
if (!calledGet)
|
||||||
|
{
|
||||||
|
calledGet = true;
|
||||||
|
GC.SuppressFinalize(this);
|
||||||
|
}
|
||||||
|
return exception;
|
||||||
|
}
|
||||||
|
|
||||||
|
~ExceptionHolder()
|
||||||
|
{
|
||||||
|
if (!calledGet)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Auto)]
|
[StructLayout(LayoutKind.Auto)]
|
||||||
public struct UniTaskCompletionSourceCore<TResult>
|
public struct UniTaskCompletionSourceCore<TResult>
|
||||||
{
|
{
|
||||||
// Struct Size: TResult + (8 + 2 + 1 + 1 + 8 + 8)
|
// Struct Size: TResult + (8 + 2 + 1 + 1 + 8 + 8)
|
||||||
|
|
||||||
TResult result;
|
TResult result;
|
||||||
object error; // ExceptionDispatchInfo or OperationCanceledException
|
object error; // ExceptionHolder or OperationCanceledException
|
||||||
short version;
|
short version;
|
||||||
bool hasUnhandledError;
|
bool hasUnhandledError;
|
||||||
int completedCount; // 0: completed == false
|
int completedCount; // 0: completed == false
|
||||||
@@ -78,9 +108,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
UniTaskScheduler.PublishUnobservedTaskException(oc);
|
UniTaskScheduler.PublishUnobservedTaskException(oc);
|
||||||
}
|
}
|
||||||
else if (error is ExceptionDispatchInfo ei)
|
else if (error is ExceptionHolder e)
|
||||||
{
|
{
|
||||||
UniTaskScheduler.PublishUnobservedTaskException(ei.SourceException);
|
UniTaskScheduler.PublishUnobservedTaskException(e.GetException().SourceException);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
@@ -129,7 +159,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.error = ExceptionDispatchInfo.Capture(error);
|
this.error = new ExceptionHolder(ExceptionDispatchInfo.Capture(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null)
|
if (continuation != null || Interlocked.CompareExchange(ref this.continuation, UniTaskCompletionSourceCoreShared.s_sentinel, null) != null)
|
||||||
@@ -199,7 +229,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
ValidateToken(token);
|
ValidateToken(token);
|
||||||
if (completedCount == 0)
|
if (completedCount == 0)
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException("not yet completed.");
|
throw new InvalidOperationException("Not yet completed, UniTask only allow to use await.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (error != null)
|
if (error != null)
|
||||||
@@ -209,9 +239,9 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
throw oce;
|
throw oce;
|
||||||
}
|
}
|
||||||
else if (error is ExceptionDispatchInfo edi)
|
else if (error is ExceptionHolder eh)
|
||||||
{
|
{
|
||||||
edi.Throw();
|
eh.GetException().Throw();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new InvalidOperationException("Critical: invalid exception type was held.");
|
throw new InvalidOperationException("Critical: invalid exception type was held.");
|
||||||
@@ -258,7 +288,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
// It will cause call OnCompleted multiple time, invalid.
|
// It will cause call OnCompleted multiple time, invalid.
|
||||||
if (!ReferenceEquals(oldContinuation, UniTaskCompletionSourceCoreShared.s_sentinel))
|
if (!ReferenceEquals(oldContinuation, UniTaskCompletionSourceCoreShared.s_sentinel))
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException();
|
throw new InvalidOperationException("Already continuation registered, can not await twice or get Status after await.");
|
||||||
}
|
}
|
||||||
|
|
||||||
continuation(state);
|
continuation(state);
|
||||||
@@ -286,99 +316,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UniTaskCompletionSource : IUniTaskSource, IPromise
|
|
||||||
{
|
|
||||||
UniTaskCompletionSourceCore<AsyncUnit> core;
|
|
||||||
bool handled = false;
|
|
||||||
|
|
||||||
public UniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
internal void MarkHandled()
|
|
||||||
{
|
|
||||||
if (!handled)
|
|
||||||
{
|
|
||||||
handled = true;
|
|
||||||
core.MarkHandled();
|
|
||||||
TaskTracker.RemoveTracking(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public UniTask Task
|
|
||||||
{
|
|
||||||
[DebuggerHidden]
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new UniTask(this, core.Version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
// Reset, re-active tracker
|
|
||||||
handled = false;
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetResult()
|
|
||||||
{
|
|
||||||
return core.TrySetResult(AsyncUnit.Default);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetCanceled(CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
return core.TrySetCanceled(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetException(Exception exception)
|
|
||||||
{
|
|
||||||
return core.TrySetException(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public void GetResult(short token)
|
|
||||||
{
|
|
||||||
MarkHandled();
|
|
||||||
core.GetResult(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTaskStatus GetStatus(short token)
|
|
||||||
{
|
|
||||||
return core.GetStatus(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTaskStatus UnsafeGetStatus()
|
|
||||||
{
|
|
||||||
return core.UnsafeGetStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
||||||
{
|
|
||||||
core.OnCompleted(continuation, state, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
~UniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
// clear error information.
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -495,116 +437,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
core.Reset();
|
core.Reset();
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AutoResetUniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UniTaskCompletionSource<T> : IUniTaskSource<T>, IPromise<T>
|
|
||||||
{
|
|
||||||
UniTaskCompletionSourceCore<T> core;
|
|
||||||
bool handled = false;
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
internal void MarkHandled()
|
|
||||||
{
|
|
||||||
if (!handled)
|
|
||||||
{
|
|
||||||
handled = true;
|
|
||||||
core.MarkHandled();
|
|
||||||
TaskTracker.RemoveTracking(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTask<T> Task
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return new UniTask<T>(this, core.Version);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public void Reset()
|
|
||||||
{
|
|
||||||
handled = false;
|
|
||||||
core.Reset();
|
|
||||||
TaskTracker.TrackActiveTask(this, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetResult(T result)
|
|
||||||
{
|
|
||||||
return core.TrySetResult(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetCanceled(CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
return core.TrySetCanceled(cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public bool TrySetException(Exception exception)
|
|
||||||
{
|
|
||||||
return core.TrySetException(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public T GetResult(short token)
|
|
||||||
{
|
|
||||||
MarkHandled();
|
|
||||||
return core.GetResult(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
void IUniTaskSource.GetResult(short token)
|
|
||||||
{
|
|
||||||
GetResult(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTaskStatus GetStatus(short token)
|
|
||||||
{
|
|
||||||
return core.GetStatus(token);
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public UniTaskStatus UnsafeGetStatus()
|
|
||||||
{
|
|
||||||
return core.UnsafeGetStatus();
|
|
||||||
}
|
|
||||||
|
|
||||||
[DebuggerHidden]
|
|
||||||
public void OnCompleted(Action<object> continuation, object state, short token)
|
|
||||||
{
|
|
||||||
core.OnCompleted(continuation, state, token);
|
|
||||||
}
|
|
||||||
|
|
||||||
~UniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
// clear error information.
|
|
||||||
core.Reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -726,15 +565,377 @@ namespace Cysharp.Threading.Tasks
|
|||||||
core.Reset();
|
core.Reset();
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
~AutoResetUniTaskCompletionSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class UniTaskCompletionSource : IUniTaskSource, IPromise
|
||||||
|
{
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
ExceptionHolder exception;
|
||||||
|
object gate;
|
||||||
|
Action<object> singleContinuation;
|
||||||
|
object singleState;
|
||||||
|
List<(Action<object>, object)> secondaryContinuationList;
|
||||||
|
|
||||||
|
int intStatus; // UniTaskStatus
|
||||||
|
bool handled = false;
|
||||||
|
|
||||||
|
public UniTaskCompletionSource()
|
||||||
|
{
|
||||||
|
TaskTracker.TrackActiveTask(this, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
internal void MarkHandled()
|
||||||
|
{
|
||||||
|
if (!handled)
|
||||||
|
{
|
||||||
|
handled = true;
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask Task
|
||||||
|
{
|
||||||
|
[DebuggerHidden]
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new UniTask(this, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetResult()
|
||||||
|
{
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetCanceled(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (UnsafeGetStatus() != UniTaskStatus.Pending) return false;
|
||||||
|
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetException(Exception exception)
|
||||||
|
{
|
||||||
|
if (exception is OperationCanceledException oce)
|
||||||
|
{
|
||||||
|
return TrySetCanceled(oce.CancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UnsafeGetStatus() != UniTaskStatus.Pending) return false;
|
||||||
|
|
||||||
|
this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception));
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
MarkHandled();
|
||||||
|
|
||||||
|
var status = (UniTaskStatus)intStatus;
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case UniTaskStatus.Succeeded:
|
||||||
|
return;
|
||||||
|
case UniTaskStatus.Faulted:
|
||||||
|
exception.GetException().Throw();
|
||||||
|
return;
|
||||||
|
case UniTaskStatus.Canceled:
|
||||||
|
throw new OperationCanceledException(cancellationToken);
|
||||||
|
default:
|
||||||
|
case UniTaskStatus.Pending:
|
||||||
|
throw new InvalidOperationException("not yet completed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return (UniTaskStatus)intStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return (UniTaskStatus)intStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
if (gate == null)
|
||||||
|
{
|
||||||
|
Interlocked.CompareExchange(ref gate, new object(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
var lockGate = Thread.VolatileRead(ref gate);
|
||||||
|
lock (lockGate) // wait TrySignalCompletion, after status is not pending.
|
||||||
|
{
|
||||||
|
if ((UniTaskStatus)intStatus != UniTaskStatus.Pending)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (singleContinuation == null)
|
||||||
|
{
|
||||||
|
singleContinuation = continuation;
|
||||||
|
singleState = state;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (secondaryContinuationList == null)
|
||||||
|
{
|
||||||
|
secondaryContinuationList = new List<(Action<object>, object)>();
|
||||||
|
}
|
||||||
|
secondaryContinuationList.Add((continuation, state));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
bool TrySignalCompletion(UniTaskStatus status)
|
||||||
|
{
|
||||||
|
if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)UniTaskStatus.Pending) == (int)UniTaskStatus.Pending)
|
||||||
|
{
|
||||||
|
if (gate == null)
|
||||||
|
{
|
||||||
|
Interlocked.CompareExchange(ref gate, new object(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
var lockGate = Thread.VolatileRead(ref gate);
|
||||||
|
lock (lockGate) // wait OnCompleted.
|
||||||
|
{
|
||||||
|
if (singleContinuation != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
singleContinuation(singleState);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (secondaryContinuationList != null)
|
||||||
|
{
|
||||||
|
foreach (var (c, state) in secondaryContinuationList)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
c(state);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
singleContinuation = null;
|
||||||
|
singleState = null;
|
||||||
|
secondaryContinuationList = null;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UniTaskCompletionSource<T> : IUniTaskSource<T>, IPromise<T>
|
||||||
|
{
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
T result;
|
||||||
|
ExceptionHolder exception;
|
||||||
|
object gate;
|
||||||
|
Action<object> singleContinuation;
|
||||||
|
object singleState;
|
||||||
|
List<(Action<object>, object)> secondaryContinuationList;
|
||||||
|
|
||||||
|
int intStatus; // UniTaskStatus
|
||||||
|
bool handled = false;
|
||||||
|
|
||||||
|
public UniTaskCompletionSource()
|
||||||
|
{
|
||||||
|
TaskTracker.TrackActiveTask(this, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
internal void MarkHandled()
|
||||||
|
{
|
||||||
|
if (!handled)
|
||||||
|
{
|
||||||
|
handled = true;
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTask<T> Task
|
||||||
|
{
|
||||||
|
[DebuggerHidden]
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new UniTask<T>(this, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetResult(T result)
|
||||||
|
{
|
||||||
|
if (UnsafeGetStatus() != UniTaskStatus.Pending) return false;
|
||||||
|
|
||||||
|
this.result = result;
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Succeeded);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetCanceled(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
if (UnsafeGetStatus() != UniTaskStatus.Pending) return false;
|
||||||
|
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Canceled);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public bool TrySetException(Exception exception)
|
||||||
|
{
|
||||||
|
if (exception is OperationCanceledException oce)
|
||||||
|
{
|
||||||
|
return TrySetCanceled(oce.CancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UnsafeGetStatus() != UniTaskStatus.Pending) return false;
|
||||||
|
|
||||||
|
this.exception = new ExceptionHolder(ExceptionDispatchInfo.Capture(exception));
|
||||||
|
return TrySignalCompletion(UniTaskStatus.Faulted);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
MarkHandled();
|
||||||
|
|
||||||
|
var status = (UniTaskStatus)intStatus;
|
||||||
|
switch (status)
|
||||||
|
{
|
||||||
|
case UniTaskStatus.Succeeded:
|
||||||
|
return result;
|
||||||
|
case UniTaskStatus.Faulted:
|
||||||
|
exception.GetException().Throw();
|
||||||
|
return default;
|
||||||
|
case UniTaskStatus.Canceled:
|
||||||
|
throw new OperationCanceledException(cancellationToken);
|
||||||
|
default:
|
||||||
|
case UniTaskStatus.Pending:
|
||||||
|
throw new InvalidOperationException("not yet completed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return (UniTaskStatus)intStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return (UniTaskStatus)intStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
if (gate == null)
|
||||||
|
{
|
||||||
|
Interlocked.CompareExchange(ref gate, new object(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
var lockGate = Thread.VolatileRead(ref gate);
|
||||||
|
lock (lockGate) // wait TrySignalCompletion, after status is not pending.
|
||||||
|
{
|
||||||
|
if ((UniTaskStatus)intStatus != UniTaskStatus.Pending)
|
||||||
|
{
|
||||||
|
continuation(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (singleContinuation == null)
|
||||||
|
{
|
||||||
|
singleContinuation = continuation;
|
||||||
|
singleState = state;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (secondaryContinuationList == null)
|
||||||
|
{
|
||||||
|
secondaryContinuationList = new List<(Action<object>, object)>();
|
||||||
|
}
|
||||||
|
secondaryContinuationList.Add((continuation, state));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[DebuggerHidden]
|
||||||
|
bool TrySignalCompletion(UniTaskStatus status)
|
||||||
|
{
|
||||||
|
if (Interlocked.CompareExchange(ref intStatus, (int)status, (int)UniTaskStatus.Pending) == (int)UniTaskStatus.Pending)
|
||||||
|
{
|
||||||
|
if (gate == null)
|
||||||
|
{
|
||||||
|
Interlocked.CompareExchange(ref gate, new object(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
var lockGate = Thread.VolatileRead(ref gate);
|
||||||
|
lock (lockGate) // wait OnCompleted.
|
||||||
|
{
|
||||||
|
if (singleContinuation != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
singleContinuation(singleState);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (secondaryContinuationList != null)
|
||||||
|
{
|
||||||
|
foreach (var (c, state) in secondaryContinuationList)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
c(state);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
singleContinuation = null;
|
||||||
|
singleState = null;
|
||||||
|
secondaryContinuationList = null;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -181,12 +181,180 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public static AsyncLazy ToAsyncLazy(this UniTask task)
|
public static AsyncLazy ToAsyncLazy(this UniTask task)
|
||||||
{
|
{
|
||||||
return new AsyncLazy(task.Preserve()); // require Preserve
|
return new AsyncLazy(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AsyncLazy<T> ToAsyncLazy<T>(this UniTask<T> task)
|
public static AsyncLazy<T> ToAsyncLazy<T>(this UniTask<T> task)
|
||||||
{
|
{
|
||||||
return new AsyncLazy<T>(task.Preserve()); // require Preserve
|
return new AsyncLazy<T>(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ignore task result when cancel raised first.
|
||||||
|
/// </summary>
|
||||||
|
public static UniTask WithCancellation(this UniTask task, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
if (!cancellationToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return UniTask.FromCanceled(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (task.Status.IsCompleted())
|
||||||
|
{
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new UniTask(new WithCancellationSource(task, cancellationToken), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ignore task result when cancel raised first.
|
||||||
|
/// </summary>
|
||||||
|
public static UniTask<T> WithCancellation<T>(this UniTask<T> task, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
if (!cancellationToken.CanBeCanceled)
|
||||||
|
{
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return UniTask.FromCanceled<T>(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (task.Status.IsCompleted())
|
||||||
|
{
|
||||||
|
return task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new UniTask<T>(new WithCancellationSource<T>(task, cancellationToken), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class WithCancellationSource : IUniTaskSource
|
||||||
|
{
|
||||||
|
static readonly Action<object> cancellationCallbackDelegate = CancellationCallback;
|
||||||
|
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
CancellationTokenRegistration tokenRegistration;
|
||||||
|
UniTaskCompletionSourceCore<AsyncUnit> core;
|
||||||
|
|
||||||
|
public WithCancellationSource(UniTask task, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this);
|
||||||
|
RunTask(task).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTaskVoid RunTask(UniTask task)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await task;
|
||||||
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
core.TrySetException(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
tokenRegistration.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CancellationCallback(object state)
|
||||||
|
{
|
||||||
|
var self = (WithCancellationSource)state;
|
||||||
|
self.core.TrySetCanceled(self.cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void GetResult(short token)
|
||||||
|
{
|
||||||
|
core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class WithCancellationSource<T> : IUniTaskSource<T>
|
||||||
|
{
|
||||||
|
static readonly Action<object> cancellationCallbackDelegate = CancellationCallback;
|
||||||
|
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
CancellationTokenRegistration tokenRegistration;
|
||||||
|
UniTaskCompletionSourceCore<T> core;
|
||||||
|
|
||||||
|
public WithCancellationSource(UniTask<T> task, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
|
this.tokenRegistration = cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallbackDelegate, this);
|
||||||
|
RunTask(task).Forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
async UniTaskVoid RunTask(UniTask<T> task)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
core.TrySetResult(await task);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
core.TrySetException(ex);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
tokenRegistration.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void CancellationCallback(object state)
|
||||||
|
{
|
||||||
|
var self = (WithCancellationSource<T>)state;
|
||||||
|
self.core.TrySetCanceled(self.cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetResult(short token)
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UNITY_2018_3_OR_NEWER
|
#if UNITY_2018_3_OR_NEWER
|
||||||
@@ -201,10 +369,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return new ToCoroutineEnumerator(task, exceptionHandler);
|
return new ToCoroutineEnumerator(task, exceptionHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async UniTask Timeout(this UniTask task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
public static async UniTask Timeout(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
||||||
{
|
{
|
||||||
var delayCancellationTokenSource = new CancellationTokenSource();
|
var delayCancellationTokenSource = new CancellationTokenSource();
|
||||||
var timeoutTask = UniTask.Delay(timeout, ignoreTimeScale, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
||||||
|
|
||||||
int winArgIndex;
|
int winArgIndex;
|
||||||
bool taskResultIsCanceled;
|
bool taskResultIsCanceled;
|
||||||
@@ -242,10 +410,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async UniTask<T> Timeout<T>(this UniTask<T> task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
public static async UniTask<T> Timeout<T>(this UniTask<T> task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
||||||
{
|
{
|
||||||
var delayCancellationTokenSource = new CancellationTokenSource();
|
var delayCancellationTokenSource = new CancellationTokenSource();
|
||||||
var timeoutTask = UniTask.Delay(timeout, ignoreTimeScale, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
||||||
|
|
||||||
int winArgIndex;
|
int winArgIndex;
|
||||||
(bool IsCanceled, T Result) taskResult;
|
(bool IsCanceled, T Result) taskResult;
|
||||||
@@ -288,10 +456,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Timeout with suppress OperationCanceledException. Returns (bool, IsCacneled).
|
/// Timeout with suppress OperationCanceledException. Returns (bool, IsCacneled).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async UniTask<bool> TimeoutWithoutException(this UniTask task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
public static async UniTask<bool> TimeoutWithoutException(this UniTask task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
||||||
{
|
{
|
||||||
var delayCancellationTokenSource = new CancellationTokenSource();
|
var delayCancellationTokenSource = new CancellationTokenSource();
|
||||||
var timeoutTask = UniTask.Delay(timeout, ignoreTimeScale, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
||||||
|
|
||||||
int winArgIndex;
|
int winArgIndex;
|
||||||
bool taskResultIsCanceled;
|
bool taskResultIsCanceled;
|
||||||
@@ -315,7 +483,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
taskCancellationTokenSource.Dispose();
|
taskCancellationTokenSource.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new TimeoutException("Exceed Timeout:" + timeout);
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -325,7 +493,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
if (taskResultIsCanceled)
|
if (taskResultIsCanceled)
|
||||||
{
|
{
|
||||||
Error.ThrowOperationCanceledException();
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -334,10 +502,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result).
|
/// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async UniTask<(bool IsTimeout, T Result)> TimeoutWithoutException<T>(this UniTask<T> task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
public static async UniTask<(bool IsTimeout, T Result)> TimeoutWithoutException<T>(this UniTask<T> task, TimeSpan timeout, DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
|
||||||
{
|
{
|
||||||
var delayCancellationTokenSource = new CancellationTokenSource();
|
var delayCancellationTokenSource = new CancellationTokenSource();
|
||||||
var timeoutTask = UniTask.Delay(timeout, ignoreTimeScale, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token).SuppressCancellationThrow();
|
||||||
|
|
||||||
int winArgIndex;
|
int winArgIndex;
|
||||||
(bool IsCanceled, T Result) taskResult;
|
(bool IsCanceled, T Result) taskResult;
|
||||||
@@ -361,7 +529,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
taskCancellationTokenSource.Dispose();
|
taskCancellationTokenSource.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new TimeoutException("Exceed Timeout:" + timeout);
|
return (true, default);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -371,7 +539,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
if (taskResult.IsCanceled)
|
if (taskResult.IsCanceled)
|
||||||
{
|
{
|
||||||
Error.ThrowOperationCanceledException();
|
return (true, default);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (false, taskResult.Result);
|
return (false, taskResult.Result);
|
||||||
@@ -393,7 +561,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
awaiter.SourceOnCompleted(state =>
|
awaiter.SourceOnCompleted(state =>
|
||||||
{
|
{
|
||||||
using (var t = (StateTuple<UniTask.Awaiter>)state)
|
using (var t = (StateTuple<UniTask.Awaiter>)state)
|
||||||
@@ -409,6 +578,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}, StateTuple.Create(awaiter));
|
}, 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)
|
||||||
{
|
{
|
||||||
@@ -461,7 +631,8 @@ namespace Cysharp.Threading.Tasks
|
|||||||
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
UniTaskScheduler.PublishUnobservedTaskException(ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
awaiter.SourceOnCompleted(state =>
|
awaiter.SourceOnCompleted(state =>
|
||||||
{
|
{
|
||||||
using (var t = (StateTuple<UniTask<T>.Awaiter>)state)
|
using (var t = (StateTuple<UniTask<T>.Awaiter>)state)
|
||||||
@@ -477,6 +648,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}, StateTuple.Create(awaiter));
|
}, 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)
|
||||||
{
|
{
|
||||||
@@ -564,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
|
||||||
|
|||||||
@@ -0,0 +1,158 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public class UniTaskSynchronizationContext : SynchronizationContext
|
||||||
|
{
|
||||||
|
const int MaxArrayLength = 0X7FEFFFFF;
|
||||||
|
const int InitialSize = 16;
|
||||||
|
|
||||||
|
static SpinLock gate = new SpinLock(false);
|
||||||
|
static bool dequing = false;
|
||||||
|
|
||||||
|
static int actionListCount = 0;
|
||||||
|
static Callback[] actionList = new Callback[InitialSize];
|
||||||
|
|
||||||
|
static int waitingListCount = 0;
|
||||||
|
static Callback[] waitingList = new Callback[InitialSize];
|
||||||
|
|
||||||
|
static int opCount;
|
||||||
|
|
||||||
|
public override void Send(SendOrPostCallback d, object state)
|
||||||
|
{
|
||||||
|
d(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Post(SendOrPostCallback d, object state)
|
||||||
|
{
|
||||||
|
bool lockTaken = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
gate.Enter(ref lockTaken);
|
||||||
|
|
||||||
|
if (dequing)
|
||||||
|
{
|
||||||
|
// Ensure Capacity
|
||||||
|
if (waitingList.Length == waitingListCount)
|
||||||
|
{
|
||||||
|
var newLength = waitingListCount * 2;
|
||||||
|
if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;
|
||||||
|
|
||||||
|
var newArray = new Callback[newLength];
|
||||||
|
Array.Copy(waitingList, newArray, waitingListCount);
|
||||||
|
waitingList = newArray;
|
||||||
|
}
|
||||||
|
waitingList[waitingListCount] = new Callback(d, state);
|
||||||
|
waitingListCount++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Ensure Capacity
|
||||||
|
if (actionList.Length == actionListCount)
|
||||||
|
{
|
||||||
|
var newLength = actionListCount * 2;
|
||||||
|
if ((uint)newLength > MaxArrayLength) newLength = MaxArrayLength;
|
||||||
|
|
||||||
|
var newArray = new Callback[newLength];
|
||||||
|
Array.Copy(actionList, newArray, actionListCount);
|
||||||
|
actionList = newArray;
|
||||||
|
}
|
||||||
|
actionList[actionListCount] = new Callback(d, state);
|
||||||
|
actionListCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (lockTaken) gate.Exit(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OperationStarted()
|
||||||
|
{
|
||||||
|
Interlocked.Increment(ref opCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OperationCompleted()
|
||||||
|
{
|
||||||
|
Interlocked.Decrement(ref opCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override SynchronizationContext CreateCopy()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// delegate entrypoint.
|
||||||
|
internal static void Run()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
bool lockTaken = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
gate.Enter(ref lockTaken);
|
||||||
|
if (actionListCount == 0) return;
|
||||||
|
dequing = true;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (lockTaken) gate.Exit(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < actionListCount; i++)
|
||||||
|
{
|
||||||
|
var action = actionList[i];
|
||||||
|
actionList[i] = default;
|
||||||
|
action.Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
bool lockTaken = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
gate.Enter(ref lockTaken);
|
||||||
|
dequing = false;
|
||||||
|
|
||||||
|
var swapTempActionList = actionList;
|
||||||
|
|
||||||
|
actionListCount = waitingListCount;
|
||||||
|
actionList = waitingList;
|
||||||
|
|
||||||
|
waitingListCount = 0;
|
||||||
|
waitingList = swapTempActionList;
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (lockTaken) gate.Exit(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[StructLayout(LayoutKind.Auto)]
|
||||||
|
readonly struct Callback
|
||||||
|
{
|
||||||
|
readonly SendOrPostCallback callback;
|
||||||
|
readonly object state;
|
||||||
|
|
||||||
|
public Callback(SendOrPostCallback callback, object state)
|
||||||
|
{
|
||||||
|
this.callback = callback;
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Invoke()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
callback(state);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
UnityEngine.Debug.LogException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: abf3aae9813db2849bce518f8596e920
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,324 @@
|
|||||||
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
||||||
|
|
||||||
|
#if UNITY_2018_4 || UNITY_2019_4_OR_NEWER
|
||||||
|
#if UNITASK_ASSETBUNDLE_SUPPORT
|
||||||
|
|
||||||
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
|
using System;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static partial class UnityAsyncExtensions
|
||||||
|
{
|
||||||
|
public static AssetBundleRequestAllAssetsAwaiter AwaitForAllAssets(this AssetBundleRequest asyncOperation)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
return new AssetBundleRequestAllAssetsAwaiter(asyncOperation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<UnityEngine.Object[]> AwaitForAllAssets(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object[]>(cancellationToken);
|
||||||
|
if (asyncOperation.isDone) return UniTask.FromResult<UnityEngine.Object[]>(asyncOperation.allAssets);
|
||||||
|
return new UniTask<UnityEngine.Object[]>(AssetBundleRequestAllAssetsWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<UnityEngine.Object[]> AwaitForAllAssets(this AssetBundleRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object[]>(cancellationToken);
|
||||||
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.allAssets);
|
||||||
|
return new UniTask<UnityEngine.Object[]>(AssetBundleRequestAllAssetsConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct AssetBundleRequestAllAssetsAwaiter : ICriticalNotifyCompletion
|
||||||
|
{
|
||||||
|
AssetBundleRequest asyncOperation;
|
||||||
|
Action<AsyncOperation> continuationAction;
|
||||||
|
|
||||||
|
public AssetBundleRequestAllAssetsAwaiter(AssetBundleRequest asyncOperation)
|
||||||
|
{
|
||||||
|
this.asyncOperation = asyncOperation;
|
||||||
|
this.continuationAction = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AssetBundleRequestAllAssetsAwaiter GetAwaiter()
|
||||||
|
{
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsCompleted => asyncOperation.isDone;
|
||||||
|
|
||||||
|
public UnityEngine.Object[] GetResult()
|
||||||
|
{
|
||||||
|
if (continuationAction != null)
|
||||||
|
{
|
||||||
|
asyncOperation.completed -= continuationAction;
|
||||||
|
continuationAction = null;
|
||||||
|
var result = asyncOperation.allAssets;
|
||||||
|
asyncOperation = null;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var result = asyncOperation.allAssets;
|
||||||
|
asyncOperation = null;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action continuation)
|
||||||
|
{
|
||||||
|
UnsafeOnCompleted(continuation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnsafeOnCompleted(Action continuation)
|
||||||
|
{
|
||||||
|
Error.ThrowWhenContinuationIsAlreadyRegistered(continuationAction);
|
||||||
|
continuationAction = PooledDelegate<AsyncOperation>.Create(continuation);
|
||||||
|
asyncOperation.completed += continuationAction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AssetBundleRequestAllAssetsWithCancellationSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsWithCancellationSource>
|
||||||
|
{
|
||||||
|
static TaskPool<AssetBundleRequestAllAssetsWithCancellationSource> pool;
|
||||||
|
AssetBundleRequestAllAssetsWithCancellationSource nextNode;
|
||||||
|
public ref AssetBundleRequestAllAssetsWithCancellationSource NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static AssetBundleRequestAllAssetsWithCancellationSource()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(AssetBundleRequestAllAssetsWithCancellationSource), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
readonly Action<AsyncOperation> continuationAction;
|
||||||
|
AssetBundleRequest asyncOperation;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
bool completed;
|
||||||
|
|
||||||
|
UniTaskCompletionSourceCore<UnityEngine.Object[]> core;
|
||||||
|
|
||||||
|
AssetBundleRequestAllAssetsWithCancellationSource()
|
||||||
|
{
|
||||||
|
continuationAction = Continuation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource<UnityEngine.Object[]> Create(AssetBundleRequest asyncOperation, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource<UnityEngine.Object[]>.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new AssetBundleRequestAllAssetsWithCancellationSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.asyncOperation = asyncOperation;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
result.completed = false;
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
PlayerLoopHelper.AddAction(PlayerLoopTiming.Update, result);
|
||||||
|
|
||||||
|
asyncOperation.completed += result.continuationAction;
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Continuation(AsyncOperation _)
|
||||||
|
{
|
||||||
|
asyncOperation.completed -= continuationAction;
|
||||||
|
|
||||||
|
if (completed)
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
core.TrySetResult(asyncOperation.allAssets);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnityEngine.Object[] GetResult(short token)
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (completed)
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
completed = true;
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
asyncOperation = default;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AssetBundleRequestAllAssetsConfiguredSource : IUniTaskSource<UnityEngine.Object[]>, IPlayerLoopItem, ITaskPoolNode<AssetBundleRequestAllAssetsConfiguredSource>
|
||||||
|
{
|
||||||
|
static TaskPool<AssetBundleRequestAllAssetsConfiguredSource> pool;
|
||||||
|
AssetBundleRequestAllAssetsConfiguredSource nextNode;
|
||||||
|
public ref AssetBundleRequestAllAssetsConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static AssetBundleRequestAllAssetsConfiguredSource()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(AssetBundleRequestAllAssetsConfiguredSource), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetBundleRequest asyncOperation;
|
||||||
|
IProgress<float> progress;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
UniTaskCompletionSourceCore<UnityEngine.Object[]> core;
|
||||||
|
|
||||||
|
AssetBundleRequestAllAssetsConfiguredSource()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource<UnityEngine.Object[]> Create(AssetBundleRequest asyncOperation, PlayerLoopTiming timing, IProgress<float> progress, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource<UnityEngine.Object[]>.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new AssetBundleRequestAllAssetsConfiguredSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.asyncOperation = asyncOperation;
|
||||||
|
result.progress = progress;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UnityEngine.Object[] GetResult(short token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (progress != null)
|
||||||
|
{
|
||||||
|
progress.Report(asyncOperation.progress);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
core.TrySetResult(asyncOperation.allAssets);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
asyncOperation = default;
|
||||||
|
progress = default;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9147caba40da434da95b39709c13784
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Threading;
|
||||||
|
using UnityEngine.Rendering;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public static partial class UnityAsyncExtensions
|
||||||
|
{
|
||||||
|
#region AsyncGPUReadbackRequest
|
||||||
|
|
||||||
|
public static UniTask<AsyncGPUReadbackRequest>.Awaiter GetAwaiter(this AsyncGPUReadbackRequest asyncOperation)
|
||||||
|
{
|
||||||
|
return ToUniTask(asyncOperation).GetAwaiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<AsyncGPUReadbackRequest> WithCancellation(this AsyncGPUReadbackRequest asyncOperation, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return ToUniTask(asyncOperation, cancellationToken: cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UniTask<AsyncGPUReadbackRequest> ToUniTask(this AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
if (asyncOperation.done) return UniTask.FromResult(asyncOperation);
|
||||||
|
return new UniTask<AsyncGPUReadbackRequest>(AsyncGPUReadbackRequestAwaiterConfiguredSource.Create(asyncOperation, timing, cancellationToken, out var token), token);
|
||||||
|
}
|
||||||
|
|
||||||
|
sealed class AsyncGPUReadbackRequestAwaiterConfiguredSource : IUniTaskSource<AsyncGPUReadbackRequest>, IPlayerLoopItem, ITaskPoolNode<AsyncGPUReadbackRequestAwaiterConfiguredSource>
|
||||||
|
{
|
||||||
|
static TaskPool<AsyncGPUReadbackRequestAwaiterConfiguredSource> pool;
|
||||||
|
AsyncGPUReadbackRequestAwaiterConfiguredSource nextNode;
|
||||||
|
public ref AsyncGPUReadbackRequestAwaiterConfiguredSource NextNode => ref nextNode;
|
||||||
|
|
||||||
|
static AsyncGPUReadbackRequestAwaiterConfiguredSource()
|
||||||
|
{
|
||||||
|
TaskPool.RegisterSizeGetter(typeof(AsyncGPUReadbackRequestAwaiterConfiguredSource), () => pool.Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
AsyncGPUReadbackRequest asyncOperation;
|
||||||
|
CancellationToken cancellationToken;
|
||||||
|
|
||||||
|
UniTaskCompletionSourceCore<AsyncGPUReadbackRequest> core;
|
||||||
|
|
||||||
|
AsyncGPUReadbackRequestAwaiterConfiguredSource()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IUniTaskSource<AsyncGPUReadbackRequest> Create(AsyncGPUReadbackRequest asyncOperation, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return AutoResetUniTaskCompletionSource<AsyncGPUReadbackRequest>.CreateFromCanceled(cancellationToken, out token);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pool.TryPop(out var result))
|
||||||
|
{
|
||||||
|
result = new AsyncGPUReadbackRequestAwaiterConfiguredSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
result.asyncOperation = asyncOperation;
|
||||||
|
result.cancellationToken = cancellationToken;
|
||||||
|
|
||||||
|
TaskTracker.TrackActiveTask(result, 3);
|
||||||
|
|
||||||
|
PlayerLoopHelper.AddAction(timing, result);
|
||||||
|
|
||||||
|
token = result.core.Version;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AsyncGPUReadbackRequest GetResult(short token)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return core.GetResult(token);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
TryReturn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IUniTaskSource.GetResult(short token)
|
||||||
|
{
|
||||||
|
GetResult(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus GetStatus(short token)
|
||||||
|
{
|
||||||
|
return core.GetStatus(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UniTaskStatus UnsafeGetStatus()
|
||||||
|
{
|
||||||
|
return core.UnsafeGetStatus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnCompleted(Action<object> continuation, object state, short token)
|
||||||
|
{
|
||||||
|
core.OnCompleted(continuation, state, token);
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool MoveNext()
|
||||||
|
{
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asyncOperation.hasError)
|
||||||
|
{
|
||||||
|
core.TrySetException(new Exception("AsyncGPUReadbackRequest.hasError = true"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (asyncOperation.done)
|
||||||
|
{
|
||||||
|
core.TrySetResult(asyncOperation);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TryReturn()
|
||||||
|
{
|
||||||
|
TaskTracker.RemoveTracking(this);
|
||||||
|
core.Reset();
|
||||||
|
asyncOperation = default;
|
||||||
|
cancellationToken = default;
|
||||||
|
return pool.TryPush(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 98f5fedb44749ab4688674d79126b46a
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using Unity.Jobs;
|
using Unity.Jobs;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
{
|
{
|
||||||
@@ -85,7 +86,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public bool MoveNext()
|
public bool MoveNext()
|
||||||
{
|
{
|
||||||
if (jobHandle.IsCompleted)
|
if (jobHandle.IsCompleted | PlayerLoopHelper.IsEditorApplicationQuitting)
|
||||||
{
|
{
|
||||||
jobHandle.Complete();
|
jobHandle.Complete();
|
||||||
core.TrySetResult(AsyncUnit.Default);
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Cysharp.Threading.Tasks.Internal;
|
using Cysharp.Threading.Tasks.Internal;
|
||||||
#if ENABLE_UNITYWEBREQUEST
|
#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT)
|
||||||
using UnityEngine.Networking;
|
using UnityEngine.Networking;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -24,6 +24,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask WithCancellation(this AsyncOperation asyncOperation, CancellationToken cancellationToken)
|
public static UniTask WithCancellation(this AsyncOperation asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.CompletedTask;
|
if (asyncOperation.isDone) return UniTask.CompletedTask;
|
||||||
return new UniTask(AsyncOperationWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new UniTask(AsyncOperationWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -31,6 +32,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask ToUniTask(this AsyncOperation asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask ToUniTask(this AsyncOperation asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.CompletedTask;
|
if (asyncOperation.isDone) return UniTask.CompletedTask;
|
||||||
return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -78,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()
|
||||||
{
|
{
|
||||||
@@ -134,6 +137,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
core.TrySetResult(AsyncUnit.Default);
|
core.TrySetResult(AsyncUnit.Default);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -185,20 +194,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncOperationWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -299,14 +301,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AsyncOperationConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -322,6 +316,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<UnityEngine.Object> WithCancellation(this ResourceRequest asyncOperation, CancellationToken cancellationToken)
|
public static UniTask<UnityEngine.Object> WithCancellation(this ResourceRequest asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
||||||
return new UniTask<UnityEngine.Object>(ResourceRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new UniTask<UnityEngine.Object>(ResourceRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -329,6 +324,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<UnityEngine.Object> ToUniTask(this ResourceRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask<UnityEngine.Object> ToUniTask(this ResourceRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
||||||
return new UniTask<UnityEngine.Object>(ResourceRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new UniTask<UnityEngine.Object>(ResourceRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -380,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()
|
||||||
{
|
{
|
||||||
@@ -436,6 +433,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
core.TrySetResult(asyncOperation.asset);
|
core.TrySetResult(asyncOperation.asset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -491,20 +494,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~ResourceRequestWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -609,18 +605,11 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~ResourceRequestConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#if UNITASK_ASSETBUNDLE_SUPPORT
|
||||||
#region AssetBundleRequest
|
#region AssetBundleRequest
|
||||||
|
|
||||||
public static AssetBundleRequestAwaiter GetAwaiter(this AssetBundleRequest asyncOperation)
|
public static AssetBundleRequestAwaiter GetAwaiter(this AssetBundleRequest asyncOperation)
|
||||||
@@ -632,6 +621,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<UnityEngine.Object> WithCancellation(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken)
|
public static UniTask<UnityEngine.Object> WithCancellation(this AssetBundleRequest asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
||||||
return new UniTask<UnityEngine.Object>(AssetBundleRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new UniTask<UnityEngine.Object>(AssetBundleRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -639,6 +629,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<UnityEngine.Object> ToUniTask(this AssetBundleRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask<UnityEngine.Object> ToUniTask(this AssetBundleRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityEngine.Object>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.asset);
|
||||||
return new UniTask<UnityEngine.Object>(AssetBundleRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new UniTask<UnityEngine.Object>(AssetBundleRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -690,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()
|
||||||
{
|
{
|
||||||
@@ -746,6 +738,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
core.TrySetResult(asyncOperation.asset);
|
core.TrySetResult(asyncOperation.asset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -801,20 +799,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AssetBundleRequestWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -919,18 +910,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AssetBundleRequestConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UNITASK_ASSETBUNDLE_SUPPORT
|
||||||
#region AssetBundleCreateRequest
|
#region AssetBundleCreateRequest
|
||||||
|
|
||||||
public static AssetBundleCreateRequestAwaiter GetAwaiter(this AssetBundleCreateRequest asyncOperation)
|
public static AssetBundleCreateRequestAwaiter GetAwaiter(this AssetBundleCreateRequest asyncOperation)
|
||||||
@@ -942,6 +927,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<AssetBundle> WithCancellation(this AssetBundleCreateRequest asyncOperation, CancellationToken cancellationToken)
|
public static UniTask<AssetBundle> WithCancellation(this AssetBundleCreateRequest asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<AssetBundle>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle);
|
||||||
return new UniTask<AssetBundle>(AssetBundleCreateRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new UniTask<AssetBundle>(AssetBundleCreateRequestWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -949,6 +935,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<AssetBundle> ToUniTask(this AssetBundleCreateRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask<AssetBundle> ToUniTask(this AssetBundleCreateRequest asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<AssetBundle>(cancellationToken);
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle);
|
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.assetBundle);
|
||||||
return new UniTask<AssetBundle>(AssetBundleCreateRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new UniTask<AssetBundle>(AssetBundleCreateRequestConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
@@ -1000,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()
|
||||||
{
|
{
|
||||||
@@ -1056,6 +1044,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
core.TrySetResult(asyncOperation.assetBundle);
|
core.TrySetResult(asyncOperation.assetBundle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1111,20 +1105,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AssetBundleCreateRequestWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -1229,19 +1216,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~AssetBundleCreateRequestConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
#endif
|
||||||
|
|
||||||
#if ENABLE_UNITYWEBREQUEST
|
#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT)
|
||||||
#region UnityWebRequestAsyncOperation
|
#region UnityWebRequestAsyncOperation
|
||||||
|
|
||||||
public static UnityWebRequestAsyncOperationAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOperation)
|
public static UnityWebRequestAsyncOperationAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOperation)
|
||||||
@@ -1253,14 +1233,30 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static UniTask<UnityWebRequest> WithCancellation(this UnityWebRequestAsyncOperation asyncOperation, CancellationToken cancellationToken)
|
public static UniTask<UnityWebRequest> WithCancellation(this UnityWebRequestAsyncOperation asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.webRequest);
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityWebRequest>(cancellationToken);
|
||||||
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
return UniTask.FromException<UnityWebRequest>(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
return UniTask.FromResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
return new UniTask<UnityWebRequest>(UnityWebRequestAsyncOperationWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new UniTask<UnityWebRequest>(UnityWebRequestAsyncOperationWithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UniTask<UnityWebRequest> ToUniTask(this UnityWebRequestAsyncOperation asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static UniTask<UnityWebRequest> ToUniTask(this UnityWebRequestAsyncOperation asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
if (asyncOperation.isDone) return UniTask.FromResult(asyncOperation.webRequest);
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<UnityWebRequest>(cancellationToken);
|
||||||
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
return UniTask.FromException<UnityWebRequest>(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
return UniTask.FromResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
return new UniTask<UnityWebRequest>(UnityWebRequestAsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new UniTask<UnityWebRequest>(UnityWebRequestAsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1285,12 +1281,20 @@ namespace Cysharp.Threading.Tasks
|
|||||||
continuationAction = null;
|
continuationAction = null;
|
||||||
var result = asyncOperation.webRequest;
|
var result = asyncOperation.webRequest;
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
throw new UnityWebRequestException(result);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var result = asyncOperation.webRequest;
|
var result = asyncOperation.webRequest;
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
throw new UnityWebRequestException(result);
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1311,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()
|
||||||
{
|
{
|
||||||
@@ -1367,7 +1372,21 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
core.TrySetResult(asyncOperation.webRequest);
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var result = asyncOperation.webRequest;
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
core.TrySetException(new UnityWebRequestException(result));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
core.TrySetResult(result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1423,20 +1442,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~UnityWebRequestAsyncOperationWithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -1525,8 +1537,15 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (asyncOperation.isDone)
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
core.TrySetResult(asyncOperation.webRequest);
|
core.TrySetResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1542,14 +1561,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~UnityWebRequestAsyncOperationConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
Func<string, string> ToUniTaskReturnType = x => (x == "void") ? "UniTask" : $"UniTask<{x}>";
|
Func<string, string> ToUniTaskReturnType = x => (x == "void") ? "UniTask" : $"UniTask<{x}>";
|
||||||
Func<string, string> ToIUniTaskSourceReturnType = x => (x == "void") ? "IUniTaskSource" : $"IUniTaskSource<{x}>";
|
Func<string, string> ToIUniTaskSourceReturnType = x => (x == "void") ? "IUniTaskSource" : $"IUniTaskSource<{x}>";
|
||||||
|
Func<(string typeName, string returnType, string returnField), bool> IsUnityWebRequest = x => x.returnType == "UnityWebRequest";
|
||||||
|
Func<(string typeName, string returnType, string returnField), bool> IsAssetBundleModule = x => x.typeName == "AssetBundleRequest" || x.typeName == "AssetBundleCreateRequest";
|
||||||
Func<(string typeName, string returnType, string returnField), bool> IsVoid = x => x.returnType == "void";
|
Func<(string typeName, string returnType, string returnField), bool> IsVoid = x => x.returnType == "void";
|
||||||
#>
|
#>
|
||||||
#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
|
||||||
@@ -34,8 +36,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static partial class UnityAsyncExtensions
|
public static partial class UnityAsyncExtensions
|
||||||
{
|
{
|
||||||
<# foreach(var t in types) { #>
|
<# foreach(var t in types) { #>
|
||||||
<# if(t.returnType == "UnityWebRequest") { #>
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
#if ENABLE_UNITYWEBREQUEST
|
#if ENABLE_UNITYWEBREQUEST
|
||||||
|
<# } else if(IsAssetBundleModule(t)) { #>
|
||||||
|
#if UNITASK_ASSETBUNDLE_SUPPORT
|
||||||
<# } #>
|
<# } #>
|
||||||
#region <#= t.typeName #>
|
#region <#= t.typeName #>
|
||||||
|
|
||||||
@@ -48,14 +52,38 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public static <#= ToUniTaskReturnType(t.returnType) #> WithCancellation(this <#= t.typeName #> asyncOperation, CancellationToken cancellationToken)
|
public static <#= ToUniTaskReturnType(t.returnType) #> WithCancellation(this <#= t.typeName #> asyncOperation, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<#= IsVoid(t) ? "" : "<" + t.returnType + ">" #>(cancellationToken);
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
return UniTask.FromException<UnityWebRequest>(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
return UniTask.FromResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
|
<# } else { #>
|
||||||
if (asyncOperation.isDone) return <#= IsVoid(t) ? "UniTask.CompletedTask" : $"UniTask.FromResult(asyncOperation.{t.returnField})" #>;
|
if (asyncOperation.isDone) return <#= IsVoid(t) ? "UniTask.CompletedTask" : $"UniTask.FromResult(asyncOperation.{t.returnField})" #>;
|
||||||
|
<# } #>
|
||||||
return new <#= ToUniTaskReturnType(t.returnType) #>(<#= t.typeName #>WithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
return new <#= ToUniTaskReturnType(t.returnType) #>(<#= t.typeName #>WithCancellationSource.Create(asyncOperation, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <#= ToUniTaskReturnType(t.returnType) #> ToUniTask(this <#= t.typeName #> asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
public static <#= ToUniTaskReturnType(t.returnType) #> ToUniTask(this <#= t.typeName #> asyncOperation, IProgress<float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));
|
||||||
|
if (cancellationToken.IsCancellationRequested) return UniTask.FromCanceled<#= IsVoid(t) ? "" : "<" + t.returnType + ">" #>(cancellationToken);
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
if (asyncOperation.isDone)
|
||||||
|
{
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
return UniTask.FromException<UnityWebRequest>(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
return UniTask.FromResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
|
<# } else { #>
|
||||||
if (asyncOperation.isDone) return <#= IsVoid(t) ? "UniTask.CompletedTask" : $"UniTask.FromResult(asyncOperation.{t.returnField})" #>;
|
if (asyncOperation.isDone) return <#= IsVoid(t) ? "UniTask.CompletedTask" : $"UniTask.FromResult(asyncOperation.{t.returnField})" #>;
|
||||||
|
<# } #>
|
||||||
return new <#= ToUniTaskReturnType(t.returnType) #>(<#= t.typeName #>ConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
return new <#= ToUniTaskReturnType(t.returnType) #>(<#= t.typeName #>ConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, out var token), token);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +109,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
<# if (!IsVoid(t)) { #>
|
<# if (!IsVoid(t)) { #>
|
||||||
var result = <#= $"asyncOperation.{t.returnField}" #>;
|
var result = <#= $"asyncOperation.{t.returnField}" #>;
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
throw new UnityWebRequestException(result);
|
||||||
|
}
|
||||||
|
<# } #>
|
||||||
return result;
|
return result;
|
||||||
<# } else { #>
|
<# } else { #>
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
@@ -91,6 +125,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
<# if (!IsVoid(t)) { #>
|
<# if (!IsVoid(t)) { #>
|
||||||
var result = <#= $"asyncOperation.{t.returnField}" #>;
|
var result = <#= $"asyncOperation.{t.returnField}" #>;
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
throw new UnityWebRequestException(result);
|
||||||
|
}
|
||||||
|
<# } #>
|
||||||
return result;
|
return result;
|
||||||
<# } else { #>
|
<# } else { #>
|
||||||
asyncOperation = null;
|
asyncOperation = null;
|
||||||
@@ -114,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()
|
||||||
{
|
{
|
||||||
@@ -170,7 +211,25 @@ namespace Cysharp.Threading.Tasks
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
|
if (cancellationToken.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(cancellationToken);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
var result = asyncOperation.webRequest;
|
||||||
|
if (result.IsError())
|
||||||
|
{
|
||||||
|
core.TrySetException(new UnityWebRequestException(result));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
core.TrySetResult(result);
|
||||||
|
}
|
||||||
|
<# } else { #>
|
||||||
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
||||||
|
<# } #>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +275,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
completed = true;
|
completed = true;
|
||||||
<# if(t.returnType == "UnityWebRequest") { #>
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
asyncOperation.webRequest.Abort();
|
asyncOperation.webRequest.Abort();
|
||||||
<# } #>
|
<# } #>
|
||||||
core.TrySetCanceled(cancellationToken);
|
core.TrySetCanceled(cancellationToken);
|
||||||
@@ -234,20 +293,13 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~<#= t.typeName #>WithCancellationSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
{
|
{
|
||||||
@@ -331,7 +383,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
{
|
{
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
<# if(t.returnType == "UnityWebRequest") { #>
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
asyncOperation.webRequest.Abort();
|
asyncOperation.webRequest.Abort();
|
||||||
<# } #>
|
<# } #>
|
||||||
core.TrySetCanceled(cancellationToken);
|
core.TrySetCanceled(cancellationToken);
|
||||||
@@ -345,7 +397,18 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
if (asyncOperation.isDone)
|
if (asyncOperation.isDone)
|
||||||
{
|
{
|
||||||
|
<# if(IsUnityWebRequest(t)) { #>
|
||||||
|
if (asyncOperation.webRequest.IsError())
|
||||||
|
{
|
||||||
|
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
core.TrySetResult(asyncOperation.webRequest);
|
||||||
|
}
|
||||||
|
<# } else { #>
|
||||||
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
core.TrySetResult(<#= IsVoid(t) ? "AsyncUnit.Default" : $"asyncOperation.{t.returnField}" #>);
|
||||||
|
<# } #>
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,18 +424,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
cancellationToken = default;
|
cancellationToken = default;
|
||||||
return pool.TryPush(this);
|
return pool.TryPush(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
~<#= t.typeName #>ConfiguredSource()
|
|
||||||
{
|
|
||||||
if (TryReturn())
|
|
||||||
{
|
|
||||||
GC.ReRegisterForFinalize(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
<# if(t.returnType == "UnityWebRequest") { #>
|
<# if(IsUnityWebRequest(t) || IsAssetBundleModule(t)) { #>
|
||||||
#endif
|
#endif
|
||||||
<# } #>
|
<# } #>
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#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
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@@ -296,6 +296,58 @@ namespace Cysharp.Threading.Tasks
|
|||||||
UniTask<T> OnEndEditAsync();
|
UniTask<T> OnEndEditAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// for TMP_PRO
|
||||||
|
|
||||||
|
public interface IAsyncEndTextSelectionEventHandler<T> : IDisposable
|
||||||
|
{
|
||||||
|
UniTask<T> OnEndTextSelectionAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAsyncTextSelectionEventHandler<T> : IDisposable
|
||||||
|
{
|
||||||
|
UniTask<T> OnTextSelectionAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAsyncDeselectEventHandler<T> : IDisposable
|
||||||
|
{
|
||||||
|
UniTask<T> OnDeselectAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAsyncSelectEventHandler<T> : IDisposable
|
||||||
|
{
|
||||||
|
UniTask<T> OnSelectAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IAsyncSubmitEventHandler<T> : IDisposable
|
||||||
|
{
|
||||||
|
UniTask<T> OnSubmitAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class TextSelectionEventConverter : UnityEvent<(string, int, int)>, IDisposable
|
||||||
|
{
|
||||||
|
readonly UnityEvent<string, int, int> innerEvent;
|
||||||
|
readonly UnityAction<string, int, int> invokeDelegate;
|
||||||
|
|
||||||
|
|
||||||
|
public TextSelectionEventConverter(UnityEvent<string, int, int> unityEvent)
|
||||||
|
{
|
||||||
|
this.innerEvent = unityEvent;
|
||||||
|
this.invokeDelegate = InvokeCore;
|
||||||
|
|
||||||
|
innerEvent.AddListener(invokeDelegate);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InvokeCore(string item1, int item2, int item3)
|
||||||
|
{
|
||||||
|
innerEvent.Invoke(item1, item2, item3);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
innerEvent.RemoveListener(invokeDelegate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class AsyncUnityEventHandler : IUniTaskSource, IDisposable, IAsyncClickEventHandler
|
public class AsyncUnityEventHandler : IUniTaskSource, IDisposable, IAsyncClickEventHandler
|
||||||
{
|
{
|
||||||
static Action<object> cancellationCallback = CancellationCallback;
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
@@ -312,6 +364,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellationToken, bool callOnce)
|
public AsyncUnityEventHandler(UnityEvent unityEvent, CancellationToken cancellationToken, bool callOnce)
|
||||||
{
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
isDisposed = true;
|
isDisposed = true;
|
||||||
@@ -320,7 +373,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
this.action = Invoke;
|
this.action = Invoke;
|
||||||
this.unityEvent = unityEvent;
|
this.unityEvent = unityEvent;
|
||||||
this.cancellationToken = cancellationToken;
|
|
||||||
this.callOnce = callOnce;
|
this.callOnce = callOnce;
|
||||||
|
|
||||||
unityEvent.AddListener(action);
|
unityEvent.AddListener(action);
|
||||||
@@ -336,6 +388,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public UniTask OnInvokeAsync()
|
public UniTask OnInvokeAsync()
|
||||||
{
|
{
|
||||||
core.Reset();
|
core.Reset();
|
||||||
|
if (isDisposed)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(this.cancellationToken);
|
||||||
|
}
|
||||||
return new UniTask(this, core.Version);
|
return new UniTask(this, core.Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,6 +458,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class AsyncUnityEventHandler<T> : IUniTaskSource<T>, IDisposable, IAsyncValueChangedEventHandler<T>, IAsyncEndEditEventHandler<T>
|
public class AsyncUnityEventHandler<T> : IUniTaskSource<T>, IDisposable, IAsyncValueChangedEventHandler<T>, IAsyncEndEditEventHandler<T>
|
||||||
|
, IAsyncEndTextSelectionEventHandler<T>, IAsyncTextSelectionEventHandler<T>, IAsyncDeselectEventHandler<T>, IAsyncSelectEventHandler<T>, IAsyncSubmitEventHandler<T>
|
||||||
{
|
{
|
||||||
static Action<object> cancellationCallback = CancellationCallback;
|
static Action<object> cancellationCallback = CancellationCallback;
|
||||||
|
|
||||||
@@ -417,6 +474,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
public AsyncUnityEventHandler(UnityEvent<T> unityEvent, CancellationToken cancellationToken, bool callOnce)
|
public AsyncUnityEventHandler(UnityEvent<T> unityEvent, CancellationToken cancellationToken, bool callOnce)
|
||||||
{
|
{
|
||||||
|
this.cancellationToken = cancellationToken;
|
||||||
if (cancellationToken.IsCancellationRequested)
|
if (cancellationToken.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
isDisposed = true;
|
isDisposed = true;
|
||||||
@@ -425,7 +483,6 @@ namespace Cysharp.Threading.Tasks
|
|||||||
|
|
||||||
this.action = Invoke;
|
this.action = Invoke;
|
||||||
this.unityEvent = unityEvent;
|
this.unityEvent = unityEvent;
|
||||||
this.cancellationToken = cancellationToken;
|
|
||||||
this.callOnce = callOnce;
|
this.callOnce = callOnce;
|
||||||
|
|
||||||
unityEvent.AddListener(action);
|
unityEvent.AddListener(action);
|
||||||
@@ -441,6 +498,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
public UniTask<T> OnInvokeAsync()
|
public UniTask<T> OnInvokeAsync()
|
||||||
{
|
{
|
||||||
core.Reset();
|
core.Reset();
|
||||||
|
if (isDisposed)
|
||||||
|
{
|
||||||
|
core.TrySetCanceled(this.cancellationToken);
|
||||||
|
}
|
||||||
return new UniTask<T>(this, core.Version);
|
return new UniTask<T>(this, core.Version);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,6 +525,12 @@ namespace Cysharp.Threading.Tasks
|
|||||||
registration.Dispose();
|
registration.Dispose();
|
||||||
if (unityEvent != null)
|
if (unityEvent != null)
|
||||||
{
|
{
|
||||||
|
// Dispose inner delegate for TextSelectionEventConverter
|
||||||
|
if (unityEvent is IDisposable disp)
|
||||||
|
{
|
||||||
|
disp.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
unityEvent.RemoveListener(action);
|
unityEvent.RemoveListener(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,6 +548,31 @@ namespace Cysharp.Threading.Tasks
|
|||||||
return OnInvokeAsync();
|
return OnInvokeAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UniTask<T> IAsyncEndTextSelectionEventHandler<T>.OnEndTextSelectionAsync()
|
||||||
|
{
|
||||||
|
return OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
UniTask<T> IAsyncTextSelectionEventHandler<T>.OnTextSelectionAsync()
|
||||||
|
{
|
||||||
|
return OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
UniTask<T> IAsyncDeselectEventHandler<T>.OnDeselectAsync()
|
||||||
|
{
|
||||||
|
return OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
UniTask<T> IAsyncSelectEventHandler<T>.OnSelectAsync()
|
||||||
|
{
|
||||||
|
return OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
UniTask<T> IAsyncSubmitEventHandler<T>.OnSubmitAsync()
|
||||||
|
{
|
||||||
|
return OnInvokeAsync();
|
||||||
|
}
|
||||||
|
|
||||||
T IUniTaskSource<T>.GetResult(short token)
|
T IUniTaskSource<T>.GetResult(short token)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -718,6 +810,10 @@ namespace Cysharp.Threading.Tasks
|
|||||||
TaskTracker.RemoveTracking(this);
|
TaskTracker.RemoveTracking(this);
|
||||||
registration1.Dispose();
|
registration1.Dispose();
|
||||||
registration2.Dispose();
|
registration2.Dispose();
|
||||||
|
if (unityEvent is IDisposable disp)
|
||||||
|
{
|
||||||
|
disp.Dispose();
|
||||||
|
}
|
||||||
unityEvent.RemoveListener(unityAction);
|
unityEvent.RemoveListener(unityAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -726,3 +822,5 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -1,12 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
using UnityEngine.UI;
|
using UnityEngine.UI;
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Cysharp.Threading.Tasks
|
namespace Cysharp.Threading.Tasks
|
||||||
{
|
{
|
||||||
public static class UnityBindingExtensions
|
public static class UnityBindingExtensions
|
||||||
{
|
{
|
||||||
|
#if !UNITY_2019_1_OR_NEWER || UNITASK_UGUI_SUPPORT
|
||||||
// <string> -> Text
|
// <string> -> Text
|
||||||
|
|
||||||
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, Text text, bool rebindOnError = true)
|
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, Text text, bool rebindOnError = true)
|
||||||
@@ -180,6 +183,7 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// <T> -> Action
|
// <T> -> Action
|
||||||
|
|
||||||
@@ -237,65 +241,5 @@ namespace Cysharp.Threading.Tasks
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TMP
|
|
||||||
|
|
||||||
#if UNITASK_TEXTMESHPRO_SUPPORT
|
|
||||||
|
|
||||||
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, TMPro.TMP_Text text, bool rebindOnError = true)
|
|
||||||
{
|
|
||||||
BindToCore(source, text, text.GetCancellationTokenOnDestroy(), rebindOnError).Forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void BindTo(this IUniTaskAsyncEnumerable<string> source, TMPro.TMP_Text text, CancellationToken cancellationToken, bool rebindOnError = true)
|
|
||||||
{
|
|
||||||
BindToCore(source, text, cancellationToken, rebindOnError).Forget();
|
|
||||||
}
|
|
||||||
|
|
||||||
static async UniTaskVoid BindToCore(IUniTaskAsyncEnumerable<string> source, TMPro.TMP_Text text, CancellationToken cancellationToken, bool rebindOnError)
|
|
||||||
{
|
|
||||||
var repeat = false;
|
|
||||||
BIND_AGAIN:
|
|
||||||
var e = source.GetAsyncEnumerator(cancellationToken);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
bool moveNext;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
moveNext = await e.MoveNextAsync();
|
|
||||||
repeat = false;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
if (ex is OperationCanceledException) return;
|
|
||||||
|
|
||||||
if (rebindOnError && !repeat)
|
|
||||||
{
|
|
||||||
repeat = true;
|
|
||||||
goto BIND_AGAIN;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!moveNext) return;
|
|
||||||
|
|
||||||
text.text = e.Current;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (e != null)
|
|
||||||
{
|
|
||||||
await e.DisposeAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#if ENABLE_UNITYWEBREQUEST && (!UNITY_2019_1_OR_NEWER || UNITASK_WEBREQUEST_SUPPORT)
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine.Networking;
|
||||||
|
|
||||||
|
namespace Cysharp.Threading.Tasks
|
||||||
|
{
|
||||||
|
public class UnityWebRequestException : Exception
|
||||||
|
{
|
||||||
|
public UnityWebRequest UnityWebRequest { get; }
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
public UnityWebRequest.Result Result { get; }
|
||||||
|
#else
|
||||||
|
public bool IsNetworkError { get; }
|
||||||
|
public bool IsHttpError { get; }
|
||||||
|
#endif
|
||||||
|
public string Error { get; }
|
||||||
|
public string Text { get; }
|
||||||
|
public long ResponseCode { get; }
|
||||||
|
public Dictionary<string, string> ResponseHeaders { get; }
|
||||||
|
|
||||||
|
string msg;
|
||||||
|
|
||||||
|
public UnityWebRequestException(UnityWebRequest unityWebRequest)
|
||||||
|
{
|
||||||
|
this.UnityWebRequest = unityWebRequest;
|
||||||
|
#if UNITY_2020_2_OR_NEWER
|
||||||
|
this.Result = unityWebRequest.result;
|
||||||
|
#else
|
||||||
|
this.IsNetworkError = unityWebRequest.isNetworkError;
|
||||||
|
this.IsHttpError = unityWebRequest.isHttpError;
|
||||||
|
#endif
|
||||||
|
this.Error = unityWebRequest.error;
|
||||||
|
this.ResponseCode = unityWebRequest.responseCode;
|
||||||
|
if (UnityWebRequest.downloadHandler != null)
|
||||||
|
{
|
||||||
|
if (unityWebRequest.downloadHandler is DownloadHandlerBuffer dhb)
|
||||||
|
{
|
||||||
|
this.Text = dhb.text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.ResponseHeaders = unityWebRequest.GetResponseHeaders();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string Message
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (msg == null)
|
||||||
|
{
|
||||||
|
if (Text != null)
|
||||||
|
{
|
||||||
|
msg = Error + Environment.NewLine + Text;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg = Error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user