Firebase异步方法GetValueAsync等待执行及Task冲突报错问题
Unity异步方法错误修复方案
原代码
public async Task DownloadTopScoreAsync() { await reference.GetValueAsync().ContinueWith(task => { if (task.IsFaulted) { Debug.Log("error"); } else if (task.IsCompleted) { DataSnapshot snapshot = task.Result; // Do something with snapshot... Debug.Log("hit"); } }); return; }
遇到的错误
- CS0433:类型'Task'同时存在于'Unity.Tasks'和'netstandard'中
- CS0126:需要可转换为'Task'类型的对象
- CS1061:'Task'不包含'GetAwaiter'的定义且找不到相关扩展方法
修复步骤
1. 解决Task命名空间冲突
在代码顶部明确指定使用的Task命名空间,避免歧义。Unity环境下优先绑定Unity的Task类型:
// 直接指定使用Unity的Task类型 using Task = Unity.Threading.Tasks.Task;
或者在方法声明中使用全限定名:
public async Unity.Threading.Tasks.Task DownloadTopScoreAsync()
2. 用async/await替代ContinueWith(重构核心)
async/await本身就是为了简化ContinueWith的回调写法,混用二者会导致Task类型嵌套,触发类型不匹配错误。重构后代码如下:
public async Task DownloadTopScoreAsync() { try { DataSnapshot snapshot = await reference.GetValueAsync(); // 处理获取到的snapshot数据 Debug.Log("hit"); } catch (Exception ex) { Debug.Log($"error: {ex.Message}"); } }
用try/catch替代IsFaulted判断,既符合异步代码的最佳实践,又避免了Task类型冲突带来的问题。
3. 确保异步返回值支持await
如果使用的是第三方SDK(比如Firebase),确认其GetValueAsync返回的Task类型已引入对应扩展包。Unity环境下需保证Unity.Tasks相关依赖已正确导入,确保Task具备GetAwaiter方法。
内容的提问来源于stack exchange,提问作者Михаил Сумароков
相关产品推荐
相关产品推荐

