Compare commits

..

19 Commits

Author SHA1 Message Date
TORISOUP
0bed67f4de Merge b02876e1df into f213ff497e 2025-05-15 19:42:26 +10:00
Ikiru Yoshizaki
f213ff497e ci: missing permission 2025-05-14 15:41:23 +09:00
Ikiru Yoshizaki
7568061eda ci: fix ghalint 2025-05-14 12:39:03 +09:00
Ikiru Yoshizaki
459a572c1d chore: add .editorconfig 2025-05-14 12:38:53 +09:00
Ikiru Yoshizaki
06067cd4c8 ci: use Cysharp/Actions checkout instead of 3rd party directly 2025-03-19 15:44:16 +09:00
Ikiru Yoshizaki
d9983cfe27 Merge pull request #654 from Cysharp/feature/pin_action
ci: Pinning third party GitHub Actions sha
2025-03-18 17:33:39 +09:00
Ikiru Yoshizaki
70eb7cd3ee ci: Pinning third party GitHub Actions sha 2025-03-18 16:58:33 +09:00
Ikiru Yoshizaki
cc3c70af90 ci: update vault 2025-03-11 12:55:51 +09:00
Ikiru Yoshizaki
8042b29ff8 ci: extend timeout 2025-01-07 12:29:34 +09:00
TORISOUP
b02876e1df chore(docs): update TOC 2025-01-06 12:09:26 +00:00
TORISOUP
17bbb168b4 add TMP_Dropdown extension 2025-01-06 21:08:39 +09:00
Yoshifumi Kawai
b0d01ca75f Merge pull request #641 from hmkc/dev
Update README_CN.md
2024-12-12 16:35:32 +09:00
hmkc
7a63ab7088 Update README_CN.md
Re-translated the documentation.
2024-12-11 17:13:32 +08:00
Yoshifumi Kawai
bdf102f145 Merge pull request #639 from hmkc/dev
Update README_CN.md
2024-12-09 20:18:43 +09:00
hmkc
41cea030ab Update README_CN.md 2024-12-09 18:39:08 +08:00
Yoshifumi Kawai
f9fd769be7 Update README.md 2024-10-09 14:46:23 +09:00
neuecc
579304fe47 chore(docs): update TOC 2024-10-08 14:02:41 +00:00
Yoshifumi Kawai
740ca7ef01 Awaitable notes 2024-10-08 23:02:26 +09:00
github-actions[bot]
7c0f199fe0 feat: Update package.json to 2.5.10 2024-10-03 00:42:37 +00:00
22 changed files with 545 additions and 496 deletions

41
.editorconfig Normal file
View File

@@ -0,0 +1,41 @@
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
# Visual Studio Spell checker configs (https://learn.microsoft.com/en-us/visualstudio/ide/text-spell-checker?view=vs-2022#how-to-customize-the-spell-checker)
spelling_exclusion_path = ./exclusion.dic
[*.cs]
indent_size = 4
charset = utf-8-bom
end_of_line = unset
# Solution files
[*.{sln,slnx}]
end_of_line = unset
# MSBuild project files
[*.{csproj,props,targets}]
end_of_line = unset
# Xml config files
[*.{ruleset,config,nuspec,resx,runsettings,DotSettings}]
end_of_line = unset
[*{_AssemblyInfo.cs,.notsupported.cs}]
generated_code = true
# C# code style settings
[*.{cs}]
dotnet_diagnostic.IDE0044.severity = none # IDE0044: Make field readonly
# https://stackoverflow.com/questions/79195382/how-to-disable-fading-unused-methods-in-visual-studio-2022-17-12-0
dotnet_diagnostic.IDE0051.severity = none # IDE0051: Remove unused private member
dotnet_diagnostic.IDE0130.severity = none # IDE0130: Namespace does not match folder structure

View File

@@ -5,3 +5,8 @@ updates:
directory: "/"
schedule:
interval: "weekly" # Check for updates to GitHub Actions every week
ignore:
# I just want update action when major/minor version is updated. patch updates are too noisy.
- dependency-name: '*'
update-types:
- version-update:semver-patch

View File

@@ -10,10 +10,12 @@ on:
jobs:
build-dotnet:
runs-on: ubuntu-latest
permissions:
contents: read
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/checkout@main
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
- run: dotnet build -c Debug
- run: dotnet test -c Debug
@@ -25,21 +27,23 @@ jobs:
max-parallel: 2
matrix:
unity: ["2022.3.39f1", "6000.0.12f1"] # Test with LTS
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
runs-on: ubuntu-24.04
timeout-minutes: 30 # Unity build takes more than 20min.
steps:
- name: Load secrets
id: op-load-secret
uses: 1password/load-secrets-action@v2
uses: 1password/load-secrets-action@581a835fb51b8e7ec56b71cf2ffddd7e68bb25e0 # v2.0.0
with:
export-env: false
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN_PUBLIC }}
UNITY_EMAIL: "op://GitHubActionsPublic/UNITY_LICENSE/username"
UNITY_PASSWORD: "op://GitHubActionsPublic/UNITY_LICENSE/credential"
UNITY_SERIAL: "op://GitHubActionsPublic/UNITY_LICENSE/serial"
UNITY_EMAIL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/username"
UNITY_PASSWORD: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/credential"
UNITY_SERIAL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/serial"
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/checkout@main
# Execute scripts: Export Package
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod PackageExporter.Export
@@ -56,10 +60,6 @@ jobs:
targetPlatform: StandaloneLinux64
buildMethod: PackageExporter.Export
- uses: Cysharp/Actions/.github/actions/check-metas@main # check meta files
with:
directory: src/UniTask
# Execute UnitTest
# /opt/Unity/Editor/Unity -quit -batchmode -nographics -silent-crashes -logFile -projectPath . -executeMethod UnitTestBuilder.BuildUnitTest /headless /ScriptBackend IL2CPP /BuildTarget StandaloneLinux64
- name: Build UnitTest (IL2CPP)
@@ -79,6 +79,10 @@ jobs:
- name: Execute UnitTest
run: ./src/UniTask/bin/UnitTest/StandaloneLinux64_IL2CPP/test
- uses: Cysharp/Actions/.github/actions/check-metas@main # check meta files
with:
directory: src/UniTask
# Store artifacts.
- uses: Cysharp/Actions/.github/actions/upload-artifact@main
if: ${{ startsWith(matrix.unity, '2021') }} # only execute 2021

View File

@@ -8,24 +8,27 @@ on:
jobs:
run-docfx:
runs-on: ubuntu-latest
permissions:
contents: write
pages: write
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/checkout@main
- uses: Cysharp/Actions/.github/actions/checkout@main
with:
repository: Cysharp/DocfxTemplate
path: docs/_DocfxTemplate
- uses: Kirbyrawr/docfx-action@master
- uses: Kirbyrawr/docfx-action@db9a22c8fe1e8693a2a21be54cb0b87dfaa72cc4
name: Docfx metadata
with:
args: metadata docs/docfx.json
- uses: Kirbyrawr/docfx-action@master
- uses: Kirbyrawr/docfx-action@db9a22c8fe1e8693a2a21be54cb0b87dfaa72cc4
name: Docfx build
with:
args: build docs/docfx.json
- name: Publish to GitHub Pages
uses: peaceiris/actions-gh-pages@v4
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: docs/_site

View File

@@ -14,6 +14,9 @@ on:
jobs:
update-packagejson:
permissions:
actions: read
contents: write
uses: Cysharp/Actions/.github/workflows/update-packagejson.yaml@main
with:
file-path: ./src/UniTask/Assets/Plugins/UniTask/package.json
@@ -22,11 +25,13 @@ jobs:
build-dotnet:
needs: [update-packagejson]
runs-on: ubuntu-latest
permissions:
contents: read
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- run: echo ${{ needs.update-packagejson.outputs.sha }}
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/checkout@main
with:
ref: ${{ needs.update-packagejson.outputs.sha }}
- uses: Cysharp/Actions/.github/actions/setup-dotnet@main
@@ -46,22 +51,24 @@ jobs:
strategy:
matrix:
unity: ["2022.3.39f1"]
runs-on: ubuntu-latest
permissions:
contents: read
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Load secrets
id: op-load-secret
uses: 1password/load-secrets-action@v2
uses: 1password/load-secrets-action@581a835fb51b8e7ec56b71cf2ffddd7e68bb25e0 # v2.0.0
with:
export-env: false
env:
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN_PUBLIC }}
UNITY_EMAIL: "op://GitHubActionsPublic/UNITY_LICENSE/username"
UNITY_PASSWORD: "op://GitHubActionsPublic/UNITY_LICENSE/credential"
UNITY_SERIAL: "op://GitHubActionsPublic/UNITY_LICENSE/serial"
UNITY_EMAIL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/username"
UNITY_PASSWORD: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/credential"
UNITY_SERIAL: "op://${{ vars.OP_VAULT_ACTIONS_PUBLIC }}/UNITY_LICENSE/serial"
- run: echo ${{ needs.update-packagejson.outputs.sha }}
- uses: actions/checkout@v4
- uses: Cysharp/Actions/.github/actions/checkout@main
with:
ref: ${{ needs.update-packagejson.outputs.sha }}
# Execute scripts: Export Package
@@ -92,6 +99,8 @@ jobs:
# release
create-release:
needs: [update-packagejson, build-dotnet, build-unity]
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/create-release.yaml@main
with:
commit-id: ${{ needs.update-packagejson.outputs.sha }}
@@ -105,6 +114,8 @@ jobs:
cleanup:
if: ${{ needs.update-packagejson.outputs.is-branch-created == 'true' }}
needs: [update-packagejson, build-dotnet, build-unity]
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/clean-packagejson-branch.yaml@main
with:
branch: ${{ needs.update-packagejson.outputs.branch-name }}

View File

@@ -7,4 +7,6 @@ on:
jobs:
detect:
permissions:
contents: read
uses: Cysharp/Actions/.github/workflows/prevent-github-change.yaml@main

View File

@@ -7,4 +7,8 @@ on:
jobs:
stale:
permissions:
contents: read
pull-requests: write
issues: write
uses: Cysharp/Actions/.github/workflows/stale-issue.yaml@main

15
.github/workflows/toc.yaml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: TOC Generator
on:
push:
paths:
- 'README.md'
jobs:
toc:
permissions:
contents: write
uses: Cysharp/Actions/.github/workflows/toc-generator.yaml@main
with:
TOC_TITLE: "## Table of Contents"
secrets: inherit

View File

@@ -1,15 +0,0 @@
name: TOC Generator
on:
push:
paths:
- 'README.md'
jobs:
generateTOC:
name: TOC Generator
runs-on: ubuntu-latest
steps:
- uses: technote-space/toc-generator@v4.3.1
with:
TOC_TITLE: "## Table of Contents"

View File

@@ -33,6 +33,7 @@ For advanced tips, see blog post: [Extends UnityWebRequest via async decorator p
- [AsyncEnumerable and Async LINQ](#asyncenumerable-and-async-linq)
- [Awaitable Events](#awaitable-events)
- [Channel](#channel)
- [vs Awaitable](#vs-awaitable)
- [For Unit Testing](#for-unit-testing)
- [ThreadPool limitation](#threadpool-limitation)
- [IEnumerator.ToUniTask limitation](#ienumeratortounitask-limitation)
@@ -67,6 +68,7 @@ async UniTask<string> DemoAsync()
await SceneManager.LoadSceneAsync("scene2");
// .WithCancellation enables Cancel, GetCancellationTokenOnDestroy synchornizes with lifetime of GameObject
// after Unity 2022.2, you can use `destroyCancellationToken` in MonoBehaviour
var asset2 = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(this.GetCancellationTokenOnDestroy());
// .ToUniTask accepts progress callback(and all options), Progress.Create is a lightweight alternative of IProgress<T>
@@ -293,6 +295,8 @@ public class MyBehaviour : MonoBehaviour
}
```
After Unity 2022.2, Unity adds CancellationToken in [MonoBehaviour.destroyCancellationToken](https://docs.unity3d.com/ScriptReference/MonoBehaviour-destroyCancellationToken.html) and [Application.exitCancellationToken](https://docs.unity3d.com/ScriptReference/Application-exitCancellationToken.html).
When cancellation is detected, all methods throw `OperationCanceledException` and propagate upstream. When exception(not limited to `OperationCanceledException`) is not handled in async method, it is propagated finally 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.`
And also `OperationCanceledException` is a special exception, this is silently ignored at `UnobservedTaskException`.
@@ -953,6 +957,14 @@ public class AsyncMessageBroker<T> : IDisposable
}
```
vs Awaitable
---
Unity 6 introduces the awaitable type, [Awaitable](https://docs.unity3d.com/6000.0/Documentation/ScriptReference/Awaitable.html). To put it simply, Awaitable can be considered a subset of UniTask, and in fact, Awaitable's design was influenced by UniTask. It should be able to handle PlayerLoop-based awaits, pooled Tasks, and support for cancellation with `CancellationToken` in a similar way. With its inclusion in the standard library, you may wonder whether to continue using UniTask or migrate to Awaitable. Here's a brief guide.
First, the functionality provided by Awaitable is equivalent to what coroutines offer. Instead of `yield return`, you use await; `await NextFrameAsync()` replaces `yield return null`; and there are equivalents for `WaitForSeconds` and `EndOfFrame`. However, that's the extent of it. Being coroutine-based in terms of functionality, it lacks Task-based features. In practical application development using async/await, operations like `WhenAll` are essential. Additionally, UniTask enables many frame-based operations (such as `DelayFrame`) and more flexible PlayerLoopTiming control, which are not available in Awaitable. Of course, there's no Tracker Window either.
Therefore, I recommend using UniTask for application development. UniTask is a superset of Awaitable and includes many essential features. For library development, where you want to avoid external dependencies, using Awaitable as a return type for methods would be appropriate. Awaitable can be converted to UniTask using `AsUniTask`, so there's no issue in handling Awaitable-based functionality within the UniTask library. Of course, if you don't need to worry about dependencies, using UniTask would be the best choice even for library development.
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 methods.

File diff suppressed because it is too large Load Diff

View File

@@ -135,8 +135,8 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
cancellationTokenRegistration.Dispose();
cancellationTokenRegistration = default;
parent.triggerEvent.Remove(this);
parent = null;
@@ -453,8 +453,8 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
cancellationTokenRegistration.Dispose();
cancellationTokenRegistration = default;
parent.triggerEvent.Remove(this);
parent = null;

View File

@@ -353,8 +353,8 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationRegistration.Dispose();
core.Reset();
cancellationRegistration.Dispose();
RestoreOriginalCallback();

View File

@@ -0,0 +1,43 @@
#if UNITASK_TEXTMESHPRO_SUPPORT
using System;
using System.Threading;
using TMPro;
namespace Cysharp.Threading.Tasks
{
public static partial class TextMeshProAsyncExtensions
{
public static IAsyncValueChangedEventHandler<int> GetAsyncValueChangedEventHandler(this TMP_Dropdown dropdown)
{
return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), false);
}
public static IAsyncValueChangedEventHandler<int> GetAsyncValueChangedEventHandler(this TMP_Dropdown dropdown, CancellationToken cancellationToken)
{
return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, cancellationToken, false);
}
public static UniTask<int> OnValueChangedAsync(this TMP_Dropdown dropdown)
{
return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy(), true).OnInvokeAsync();
}
public static UniTask<int> OnValueChangedAsync(this TMP_Dropdown dropdown, CancellationToken cancellationToken)
{
return new AsyncUnityEventHandler<int>(dropdown.onValueChanged, cancellationToken, true).OnInvokeAsync();
}
public static IUniTaskAsyncEnumerable<int> OnValueChangedAsAsyncEnumerable(this TMP_Dropdown dropdown)
{
return new UnityEventHandlerAsyncEnumerable<int>(dropdown.onValueChanged, dropdown.GetCancellationTokenOnDestroy());
}
public static IUniTaskAsyncEnumerable<int> OnValueChangedAsAsyncEnumerable(this TMP_Dropdown dropdown, CancellationToken cancellationToken)
{
return new UnityEventHandlerAsyncEnumerable<int>(dropdown.onValueChanged, cancellationToken);
}
}
}
#endif

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: b858132b120c42b99cac55fd06dd32d3
timeCreated: 1736165018

View File

@@ -255,7 +255,7 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
TryReturn();
}
@@ -289,7 +289,6 @@ namespace Cysharp.Threading.Tasks
return false;
}
cancellationTokenRegistration.Dispose();
core.TrySetResult(null);
return false;
}
@@ -297,9 +296,9 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
@@ -367,7 +366,7 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
TryReturn();
}
@@ -413,9 +412,9 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
cancellationToken = default;
cancellationTokenRegistration.Dispose();
return pool.TryPush(this);
}
}

View File

@@ -42,7 +42,6 @@ namespace Cysharp.Threading.Tasks
return new UniTask(AsyncOperationConfiguredSource.Create(asyncOperation, timing, progress, cancellationToken, cancelImmediately, out var token), token);
}
#if !UNITY_2023_1_OR_NEWER
public struct AsyncOperationAwaiter : ICriticalNotifyCompletion
{
AsyncOperation asyncOperation;
@@ -82,7 +81,6 @@ namespace Cysharp.Threading.Tasks
asyncOperation.completed += continuationAction;
}
}
#endif
sealed class AsyncOperationConfiguredSource : IUniTaskSource, IPlayerLoopItem, ITaskPoolNode<AsyncOperationConfiguredSource>
{
@@ -101,7 +99,6 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
bool allowReturn;
UniTaskCompletionSourceCore<AsyncUnit> core;
@@ -129,8 +126,7 @@ namespace Cysharp.Threading.Tasks
result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false;
result.allowReturn = false;
asyncOperation.completed += result.continuationAction;
if (cancelImmediately && cancellationToken.CanBeCanceled)
@@ -158,16 +154,9 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
if (allowReturn)
{
TryReturn();
}
else
{
allowReturn = true;
}
TryReturn();
}
else
{
@@ -194,15 +183,9 @@ namespace Cysharp.Threading.Tasks
public bool MoveNext()
{
if (allowReturn)
// Already completed
if (completed || asyncOperation == null)
{
TryReturn();
return false;
}
if (completed)
{
allowReturn = true;
return false;
}
@@ -219,8 +202,6 @@ namespace Cysharp.Threading.Tasks
if (asyncOperation.isDone)
{
cancellationTokenRegistration.Dispose();
allowReturn = true;
core.TrySetResult(AsyncUnit.Default);
return false;
}
@@ -231,31 +212,29 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
asyncOperation.completed -= continuationAction;
asyncOperation = default;
progress = default;
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
void Continuation(AsyncOperation _)
{
if (completed)
{
return;
}
completed = true;
cancellationTokenRegistration.Dispose();
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
}
else
{
if (progress != null)
{
progress.Report(asyncOperation.progress);
}
core.TrySetResult(AsyncUnit.Default);
}
}
@@ -350,7 +329,6 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
bool allowReturn;
UniTaskCompletionSourceCore<UnityEngine.Object> core;
@@ -378,8 +356,7 @@ namespace Cysharp.Threading.Tasks
result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false;
result.allowReturn = false;
asyncOperation.completed += result.continuationAction;
if (cancelImmediately && cancellationToken.CanBeCanceled)
@@ -407,16 +384,9 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
if (allowReturn)
{
TryReturn();
}
else
{
allowReturn = true;
}
TryReturn();
}
else
{
@@ -447,15 +417,9 @@ namespace Cysharp.Threading.Tasks
public bool MoveNext()
{
if (allowReturn)
// Already completed
if (completed || asyncOperation == null)
{
TryReturn();
return false;
}
if (completed)
{
allowReturn = true;
return false;
}
@@ -472,8 +436,6 @@ namespace Cysharp.Threading.Tasks
if (asyncOperation.isDone)
{
cancellationTokenRegistration.Dispose();
allowReturn = true;
core.TrySetResult(asyncOperation.asset);
return false;
}
@@ -484,31 +446,29 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
asyncOperation.completed -= continuationAction;
asyncOperation = default;
progress = default;
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
void Continuation(AsyncOperation _)
{
if (completed)
{
return;
}
completed = true;
cancellationTokenRegistration.Dispose();
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
}
else
{
if (progress != null)
{
progress.Report(asyncOperation.progress);
}
core.TrySetResult(asyncOperation.asset);
}
}
@@ -604,7 +564,6 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
bool allowReturn;
UniTaskCompletionSourceCore<UnityEngine.Object> core;
@@ -632,8 +591,7 @@ namespace Cysharp.Threading.Tasks
result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false;
result.allowReturn = false;
asyncOperation.completed += result.continuationAction;
if (cancelImmediately && cancellationToken.CanBeCanceled)
@@ -661,16 +619,9 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
if (allowReturn)
{
TryReturn();
}
else
{
allowReturn = true;
}
TryReturn();
}
else
{
@@ -701,15 +652,9 @@ namespace Cysharp.Threading.Tasks
public bool MoveNext()
{
if (allowReturn)
// Already completed
if (completed || asyncOperation == null)
{
TryReturn();
return false;
}
if (completed)
{
allowReturn = true;
return false;
}
@@ -726,8 +671,6 @@ namespace Cysharp.Threading.Tasks
if (asyncOperation.isDone)
{
cancellationTokenRegistration.Dispose();
allowReturn = true;
core.TrySetResult(asyncOperation.asset);
return false;
}
@@ -738,31 +681,29 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
TaskTracker.RemoveTracking(this);
cancellationTokenRegistration.Dispose();
core.Reset();
asyncOperation.completed -= continuationAction;
asyncOperation = default;
progress = default;
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
void Continuation(AsyncOperation _)
{
if (completed)
{
return;
}
completed = true;
cancellationTokenRegistration.Dispose();
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
}
else
{
if (progress != null)
{
progress.Report(asyncOperation.progress);
}
core.TrySetResult(asyncOperation.asset);
}
}
@@ -859,7 +800,6 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
bool allowReturn;
UniTaskCompletionSourceCore<AssetBundle> core;
@@ -887,8 +827,7 @@ namespace Cysharp.Threading.Tasks
result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false;
result.allowReturn = false;
asyncOperation.completed += result.continuationAction;
if (cancelImmediately && cancellationToken.CanBeCanceled)
@@ -916,16 +855,9 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
if (allowReturn)
{
TryReturn();
}
else
{
allowReturn = true;
}
TryReturn();
}
else
{
@@ -956,15 +888,9 @@ namespace Cysharp.Threading.Tasks
public bool MoveNext()
{
if (allowReturn)
// Already completed
if (completed || asyncOperation == null)
{
TryReturn();
return false;
}
if (completed)
{
allowReturn = true;
return false;
}
@@ -981,8 +907,6 @@ namespace Cysharp.Threading.Tasks
if (asyncOperation.isDone)
{
cancellationTokenRegistration.Dispose();
allowReturn = true;
core.TrySetResult(asyncOperation.assetBundle);
return false;
}
@@ -992,32 +916,30 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
cancellationTokenRegistration.Dispose();
TaskTracker.RemoveTracking(this);
core.Reset();
asyncOperation.completed -= continuationAction;
asyncOperation = default;
progress = default;
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
void Continuation(AsyncOperation _)
{
if (completed)
{
return;
}
completed = true;
cancellationTokenRegistration.Dispose();
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
}
else
{
if (progress != null)
{
progress.Report(asyncOperation.progress);
}
core.TrySetResult(asyncOperation.assetBundle);
}
}
@@ -1129,7 +1051,6 @@ namespace Cysharp.Threading.Tasks
CancellationTokenRegistration cancellationTokenRegistration;
bool cancelImmediately;
bool completed;
bool allowReturn;
UniTaskCompletionSourceCore<UnityWebRequest> core;
@@ -1157,8 +1078,7 @@ namespace Cysharp.Threading.Tasks
result.cancellationToken = cancellationToken;
result.cancelImmediately = cancelImmediately;
result.completed = false;
result.allowReturn = false;
asyncOperation.completed += result.continuationAction;
if (cancelImmediately && cancellationToken.CanBeCanceled)
@@ -1187,16 +1107,9 @@ namespace Cysharp.Threading.Tasks
}
finally
{
if (!cancellationToken.IsCancellationRequested)
if (!(cancelImmediately && cancellationToken.IsCancellationRequested))
{
if (allowReturn)
{
TryReturn();
}
else
{
allowReturn = true;
}
TryReturn();
}
else
{
@@ -1227,20 +1140,15 @@ namespace Cysharp.Threading.Tasks
public bool MoveNext()
{
if (allowReturn)
// Already completed
if (completed || asyncOperation == null)
{
TryReturn();
return false;
}
if (completed)
{
allowReturn = true;
return false;
}
if (cancellationToken.IsCancellationRequested)
{
asyncOperation.webRequest.Abort();
core.TrySetCanceled(cancellationToken);
return false;
}
@@ -1252,9 +1160,14 @@ namespace Cysharp.Threading.Tasks
if (asyncOperation.isDone)
{
cancellationTokenRegistration.Dispose();
allowReturn = true;
core.TrySetResult(asyncOperation.webRequest);
if (asyncOperation.webRequest.IsError())
{
core.TrySetException(new UnityWebRequestException(asyncOperation.webRequest));
}
else
{
core.TrySetResult(asyncOperation.webRequest);
}
return false;
}
@@ -1263,22 +1176,24 @@ namespace Cysharp.Threading.Tasks
bool TryReturn()
{
cancellationTokenRegistration.Dispose();
TaskTracker.RemoveTracking(this);
core.Reset();
asyncOperation.completed -= continuationAction;
asyncOperation = default;
progress = default;
cancellationToken = default;
cancellationTokenRegistration.Dispose();
cancelImmediately = default;
return pool.TryPush(this);
}
void Continuation(AsyncOperation _)
{
if (completed)
{
return;
}
completed = true;
cancellationTokenRegistration.Dispose();
if (cancellationToken.IsCancellationRequested)
{
core.TrySetCanceled(cancellationToken);
@@ -1289,11 +1204,6 @@ namespace Cysharp.Threading.Tasks
}
else
{
if (progress != null)
{
progress.Report(asyncOperation.progress);
}
core.TrySetResult(asyncOperation.webRequest);
}
}

View File

@@ -2,7 +2,7 @@
"name": "com.cysharp.unitask",
"displayName": "UniTask",
"author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" },
"version": "2.5.9",
"version": "2.5.10",
"unity": "2018.4",
"description": "Provides an efficient async/await integration to Unity.",
"keywords": [ "async/await", "async", "Task", "UniTask" ],

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b055f3837a55b4a44abf9bf4bcb3594f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1 +0,0 @@
MyTEST

View File

@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 49ccc900467d35543bb602a3de4d786a
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -21,6 +21,7 @@ using System.Linq.Expressions;
using UnityEngine.Events;
// using DG.Tweening;
@@ -179,7 +180,7 @@ public class SandboxMain : MonoBehaviour
//UnityAction action;
return 10;
}
@@ -591,78 +592,69 @@ public class SandboxMain : MonoBehaviour
async UniTaskVoid Start()
{
var p = Progress.Create<float>(x =>
await new WhenEachTest().Each();
// UniTask.Delay(TimeSpan.FromSeconds(1)).TimeoutWithoutException
var currentLoop = PlayerLoop.GetDefaultPlayerLoop();
PlayerLoopHelper.Initialize(ref currentLoop, InjectPlayerLoopTimings.Minimum); // minimum is Update | FixedUpdate | LastPostLateUpdate
// TestAsync(cts.Token).Forget();
okButton.onClick.AddListener(UniTask.UnityAction(async () =>
{
Debug.Log(x);
});
var foo = await Resources.LoadAsync("test2").ToUniTask(progress: p) as TextAsset;
Debug.Log(foo.text);
//var foo2 = await Resources.LoadAsync("test2").ToUniTask() as TextAsset;
//Debug.Log(foo2.text); // onemore?
await UniTask.WaitForEndOfFrame(this);
var texture = new Texture2D(Screen.width, Screen.height);
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
texture.Apply();
var jpg = texture.EncodeToJPG();
File.WriteAllBytes("testscreencapture.jpg", jpg);
Debug.Log("ok?");
//var texture = ScreenCapture.CaptureScreenshotAsTexture();
//if (texture == null)
//{
// Debug.Log("fail");
//}
//else
//{
// var jpg = texture.EncodeToJPG();
// File.WriteAllBytes("testscreencapture.jpg", jpg);
// Debug.Log("ok?");
//}
}));
//await new WhenEachTest().Each();
cancelButton.onClick.AddListener(UniTask.UnityAction(async () =>
{
//clickCancelSource.Cancel();
//RunCheck(PlayerLoopTiming.Initialization).Forget();
//RunCheck(PlayerLoopTiming.LastInitialization).Forget();
//RunCheck(PlayerLoopTiming.EarlyUpdate).Forget();
//RunCheck(PlayerLoopTiming.LastEarlyUpdate).Forget();
//RunCheck(PlayerLoopTiming.FixedUpdate).Forget();
//RunCheck(PlayerLoopTiming.LastFixedUpdate).Forget();
//RunCheck(PlayerLoopTiming.PreUpdate).Forget();
//RunCheck(PlayerLoopTiming.LastPreUpdate).Forget();
//RunCheck(PlayerLoopTiming.Update).Forget();
//RunCheck(PlayerLoopTiming.LastUpdate).Forget();
//RunCheck(PlayerLoopTiming.PreLateUpdate).Forget();
//RunCheck(PlayerLoopTiming.LastPreLateUpdate).Forget();
//RunCheck(PlayerLoopTiming.PostLateUpdate).Forget();
//RunCheck(PlayerLoopTiming.LastPostLateUpdate).Forget();
//// UniTask.Delay(TimeSpan.FromSeconds(1)).TimeoutWithoutException
await UniTask.Yield();
}));
//var currentLoop = PlayerLoop.GetDefaultPlayerLoop();
//PlayerLoopHelper.Initialize(ref currentLoop, InjectPlayerLoopTimings.Minimum); // minimum is Update | FixedUpdate | LastPostLateUpdate
//// TestAsync(cts.Token).Forget();
//okButton.onClick.AddListener(UniTask.UnityAction(async () =>
//{
// await UniTask.WaitForEndOfFrame(this);
// var texture = new Texture2D(Screen.width, Screen.height);
// texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
// texture.Apply();
// var jpg = texture.EncodeToJPG();
// File.WriteAllBytes("testscreencapture.jpg", jpg);
// Debug.Log("ok?");
// //var texture = ScreenCapture.CaptureScreenshotAsTexture();
// //if (texture == null)
// //{
// // Debug.Log("fail");
// //}
// //else
// //{
// // var jpg = texture.EncodeToJPG();
// // File.WriteAllBytes("testscreencapture.jpg", jpg);
// // Debug.Log("ok?");
// //}
//}));
//cancelButton.onClick.AddListener(UniTask.UnityAction(async () =>
//{
// //clickCancelSource.Cancel();
// //RunCheck(PlayerLoopTiming.Initialization).Forget();
// //RunCheck(PlayerLoopTiming.LastInitialization).Forget();
// //RunCheck(PlayerLoopTiming.EarlyUpdate).Forget();
// //RunCheck(PlayerLoopTiming.LastEarlyUpdate).Forget();
// //RunCheck(PlayerLoopTiming.FixedUpdate).Forget();
// //RunCheck(PlayerLoopTiming.LastFixedUpdate).Forget();
// //RunCheck(PlayerLoopTiming.PreUpdate).Forget();
// //RunCheck(PlayerLoopTiming.LastPreUpdate).Forget();
// //RunCheck(PlayerLoopTiming.Update).Forget();
// //RunCheck(PlayerLoopTiming.LastUpdate).Forget();
// //RunCheck(PlayerLoopTiming.PreLateUpdate).Forget();
// //RunCheck(PlayerLoopTiming.LastPreLateUpdate).Forget();
// //RunCheck(PlayerLoopTiming.PostLateUpdate).Forget();
// //RunCheck(PlayerLoopTiming.LastPostLateUpdate).Forget();
// await UniTask.Yield();
//}));
await UniTask.Yield();
}
async UniTaskVoid RunCheck(PlayerLoopTiming timing)