目录
1.WithCancellation 取消标记,可以在满足取消条件的时候,停止该异步,例如:
*如果有多个取消条件,可以通过CancellationTokenSource.CreateLinkedTokenSource创建取消链
1.git地址:
GitHub - Cysharp/UniTask: Provides an efficient allocation free async/await integration for Unity.
1.技术细节:
2.与其他方案比较
3.性能对比
1顺序执行任务效率相似
2并行任务Task比UniTask执行效率更高
3 GC对比,分别并行10万个任务:
Task,平均每次增长30M左右。
UniTask,第一次会增长,幅度跟Task差不多,应该是做了一些初始化的操作,第四次会增长,暂时不知道原因,后续内存不会再增长。
2.对unity api的支持
可以在使用 using Cysharp.Threading.Tasks;时对
AsyncOperation,
ResourceRequest,
AssetBundleRequest,
AssetBundleCreateRequest,
UnityWebRequestAsyncOperation,
AsyncGPUReadbackRequest,
IEnumerator以及其他的异步操作直接进行 await
1.WithCancellation 取消标记,可以在满足取消条件的时候,停止该异步,例如:
var asset2 = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(this.GetCancellationTokenOnDestroy());
GetCancellationTokenOnDestroy
是unitask提供的扩展,可以获得monoBehaviour、gameObject、component的取消令牌
async UniTaskVoid DemoAsync2()
{
var cts = new CancellationTokenSource();
cancelButton.onClick.AddListener(() =>
{
cts.Cancel();
Debug.Log("DemoAsync2: 取消");
});
await UniTask.Delay(TimeSpan.FromSeconds(3), cancellationToken: cts.Token);
// var asset = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(this.GetCancellationTokenOnDestroy());
var asset2 = await Resources.LoadAsync<TextAsset>("bar").WithCancellation(cts.Token);