using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using UnityEngine;
///
/// 异步懒加载:保证 factory 只执行一次,支持多个并发 await(每个调用者独立 TCS)
/// 非泛型设计,避免热更 AOT 泛型问题
///
public class AsyncLazy
{
public delegate UniTask AsyncFactory();
private readonly AsyncFactory factory;
private List waiters;
private bool hasCompleted;
private bool isRunning;
public AsyncLazy(AsyncFactory factory, string debugName = "")
{
this.factory = factory;
}
public UniTask Task
{
get
{
if (hasCompleted)
{
return UniTask.CompletedTask;
}
var tcs = new UniTaskCompletionSource();
if (waiters == null) waiters = new List();
waiters.Add(tcs);
if (!isRunning)
{
isRunning = true;
Run().Forget();
}
return tcs.Task;
}
}
private async UniTaskVoid Run()
{
try
{
await factory();
hasCompleted = true;
if (waiters != null)
{
for (int i = 0; i < waiters.Count; i++)
waiters[i].TrySetResult();
waiters.Clear();
}
}
catch (Exception ex)
{
if (waiters != null)
{
for (int i = 0; i < waiters.Count; i++)
waiters[i].TrySetException(ex);
waiters.Clear();
}
}
}
public void Reset()
{
hasCompleted = false;
isRunning = false;
waiters = null;
}
}