#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![[Pasted image 20250207115408.png]]
💡 常见用途
• 后台任务(如数据存储、日志记录)
• 游戏中的无 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 等待结果。 🚀