【发布时间】:2020-09-18 10:16:49
【问题描述】:
我在 Unity 和 Firebase 上为这个项目使用 C#,但我不确定这是一个框架问题,更像是 async-approach-trouble。
我有一个在我的 firebase 数据库 (Firestore) 上写入数据的方法,这是我的 Database 类中的方法:
public async void AsyncAddData()
{
User newUser = new User()
{
isConfigured = false,
tag = userName,
accessToken = ""
};
DocumentReference docRef = db.Collection("users").Document(newUser.tag);
await docRef.SetAsync(newUser);
Debug.Log("Added new user " + newUser.tag);
}
当从我的MainController 调用时,此方法完美运行,例如:Database.AsyncAddData()。
麻烦从开始,而不是在异步方法中创建new User 变量,而是尝试从我的MainController 传递一个已经存在的User 变量,例如Database.AsyncAddData(this.currentUser),所以async 方法现在看起来像:
public async void AsyncAddData(User newUser)
{
DocumentReference docRef = db.Collection("users").Document(newUser.tag);
await docRef.SetAsync(newUser);
Debug.Log("Added new user " + newUser.tag);
}
此方法会使整个软件崩溃。经过一番试验后,我的想法是,将currentUser 之类的“同步”变量传递给异步方法是不可行的。我想是的,因为如果我这样做Database.AsyncAddData(new User() { tag = currentUserLoged.tag }),它会起作用。
所以现在我的问题是……
如何将外部变量传递给异步方法?
已阅读相关帖子和问题:
Async Await Issue for methods with parameters
【问题讨论】:
-
问题 - 你为什么使用 async void 而不是 async Task?
-
async void 会将所有异常返回给主线程。因为 Unity 不支持它,所以它只会崩溃。在正常的应用程序中,它会在主线程的“随机”位置抛出异常。
-
除非必须,否则不要使用 async void(例外:事件处理程序)。
-
@PhilS 老实说,因为这对我来说似乎很简单,如果我不想返回任何东西,就不要这样做。但是看看你所有的 cmets,我肯定会看看这种方法。
-
@TomaszJuszczak 是有道理的......所以问题不可能是由异步的东西引起的,只是我有一个错误,比如我的标签为空,并且异常崩溃了统一,对吗?
标签: c# firebase unity3d google-cloud-firestore async-await