2.1 KiB
2.1 KiB
#unity/日常积累
在 UniTask 中,Forget() 的作用是 启动一个异步任务但不等待其完成,类似于 Task.Run(() => { }),适用于 不关心返回值 的场景。
🚀 Forget() 作用 Forget() 主要用于 避免在 async void 方法中抛出未捕获的异常,并防止 async 方法在 Unity 中导致潜在问题。 ✅ 使用示例
public void Start()
{
SomeAsyncMethod().Forget(); // 启动任务但不等待
}
private async UniTask SomeAsyncMethod()
{
await UniTask.Delay(1000);
Debug.Log("任务完成");
}
📌 作用:
- 代码 不会阻塞主线程,
SomeAsyncMethod()
会独立运行。 - 不会产生未观察到的
Task
异常(相当于Task.Run(async () => { ... }).ConfigureAwait(false);
)。 - 适用于 希望异步运行但不想等待返回值的任务。
🔹 Forget()
vs await
💡 常见用途 • 后台任务(如数据存储、日志记录) • 游戏中的无 UI 相关逻辑(如 保存存档、网络请求) • 避免 async void 未捕获异常
⚠️ 注意事项 1 异常不会自动传播 ◦ 由于 Forget() 不会等待,如果 SomeAsyncMethod 抛出异常,不会有任何异常日志。 ◦ 解决方案:使用 Forget(Debug.LogException) 记录异常:
SomeAsyncMethod().Forget(Debug.LogException);
不适用于需要结果的任务
- 不能
Forget()
返回UniTask<T>
的方法,否则会丢失返回值:
async UniTask<int> GetDataAsync()
{
await UniTask.Delay(1000);
return 42;
}
public void Start()
{
int result = GetDataAsync().Forget(); // ❌ 错误!无法获取返回值
}
正确方式:
public async void Start()
{
int result = await GetDataAsync(); // ✅ 正确
}
✅ 结论
Forget()
适用于不关心返回值 的任务,避免async void
问题。- 不会阻塞主线程,但也不会捕获异常,建议
Forget(Debug.LogException)
。 - 如果需要返回值,就不要用
Forget()
,用await
等待结果。 🚀