C# 当我尝试异步检查firebase firestore中的用户名时,Unity冻结

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

嗨,我正在为我的应用程序构建注册场景,但是当它要检查用户名是否存在时,整个unity都冻结了

下面是我尝试过的所有函数:

这是firebase文档中的一个

       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));