obsidian/笔记文件/2.笔记/unitask Forget.md
2025-03-26 00:02:56 +08:00

2.1 KiB
Raw Permalink Blame History

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