C# 当我尝试异步检查firebase firestore中的用户名时,Unity冻结
嗨,我正在为我的应用程序构建注册场景,但是当它要检查用户名是否存在时,整个unity都冻结了 下面是我尝试过的所有函数: 这是firebase文档中的一个C# 当我尝试异步检查firebase firestore中的用户名时,Unity冻结,c#,unity3d,google-cloud-firestore,async-await,mobile-application,C#,Unity3d,Google Cloud Firestore,Async Await,Mobile Application,嗨,我正在为我的应用程序构建注册场景,但是当它要检查用户名是否存在时,整个unity都冻结了 下面是我尝试过的所有函数: 这是firebase文档中的一个 public async Task<bool> checkIfExists(string WhatToCheck="username", string TextToCheck) { FirebaseFirestore db = FirebaseFirestore.Defau
public async Task<bool> checkIfExists(string WhatToCheck="username", string TextToCheck) {
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
CollectionReference docRef = db.Collection("users");
Query query = docRef.WhereEqualTo(WhatToCheck, TextToCheck);
QuerySnapshot querySnapshot = await query.GetSnapshotAsync();
foreach (DocumentSnapshot documentSnapshot in querySnapshot.Documents) {
return true;
}
return false;
}
最后一个有效,但由于明显的原因,它总是返回false
这是firebase中的“我的用户”集合:
编辑:刚刚发现问题是我用来将任务转换为bool的函数
public bool checkIfExistsUsernameConverter(string TextToCheck) {
return checkIfExists(TextToCheck).Result;
}
这就是冻结应用程序的原因
编辑:我解决了冻结问题。问题是我没有在函数引用中放置等待者:
bool UsernameExists = await Task.Run(() => Database.current.checkIfExistsUsernameConverter(usernameIF.text));
但是现在它给了我这个错误,没有行代码引用:
bool UsernameExists = await Task.Run(() => Database.current.checkIfExistsUsernameConverter(usernameIF.text));
ArgumentException:方法返回类型不兼容
System.Delegate.CreateDelegate(System.Type类型,System.Object firstArgument,System.Reflection.MethodInfo方法,System.Boolean throwOnBindFailure,System.Boolean allowClosed)(位于:0)
Unity不支持-我重复一遍-不支持
async/await
。
原因是UnyD3D是一个用C++编写的应用程序,你只需通过互操作与它交互,它们就使用了它们自己的多线程环境。从理论上讲,您可以“以旧的方式”创建和管理自己的线程,但这会导致上下文切换,因为它们是系统。
要在Unity中使用多线程,您需要使用JobSystem,那么问题是它冻结还是返回false?请注意,在实际收到异步快照之前很久,外部
返回就已经完成了。。。此外,lambda表达式中的内部返回仅从该lambda表达式返回。。不是你的方法。问题是它冻结了,除了最后一个每次都返回false的方法,因为你说这不是我第一次在unity中使用async/Wait,它每次都工作,除了这种情况..直到你构建你的游戏:)点是,Unity甚至不尝试在自己的自定义Mono运行时中修复与async/await相关的任何内容,这意味着它不受支持。它不仅比使用同步代码的性能更低,而且是一种不好的做法,不是统一的标准。而且,工作制做得很好。记住:异步/等待不是线程安全的;就业制度正在改变。但是,嘿,这是你的选择:谢谢你的提示,我试试看(:
bool UsernameExists = await Task.Run(() => Database.current.checkIfExistsUsernameConverter(usernameIF.text));