unitask Forget.md 2.1 KB

#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 等待结果。 🚀