#unity/日常积累 在 UniTask 中,Forget() 的作用是 启动一个异步任务但不等待其完成,类似于 Task.Run(() => { }),适用于 不关心返回值 的场景。 🚀 Forget() 作用 Forget() 主要用于 避免在 async void 方法中抛出未捕获的异常,并防止 async 方法在 Unity 中导致潜在问题。 ✅ 使用示例 ``` cs 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) 记录异常: ``` cs SomeAsyncMethod().Forget(Debug.LogException); ``` **不适用于需要结果的任务** - 不能 `Forget()` 返回 `UniTask` 的方法,否则会丢失返回值: ``` cs async UniTask GetDataAsync() { await UniTask.Delay(1000); return 42; } public void Start() { int result = GetDataAsync().Forget(); // ❌ 错误!无法获取返回值 } ``` **正确方式**: ``` cs public async void Start() { int result = await GetDataAsync(); // ✅ 正确 } ``` ### **✅ 结论** - `Forget()` **适用于不关心返回值** 的任务,避免 `async void` 问题。 - **不会阻塞主线程**,但也不会捕获异常,建议 `Forget(Debug.LogException)` 。 - **如果需要返回值,就不要用 `Forget()`**,用 `await` 等待结果。 🚀