Fire Base数据库循环的C#脚本不是逻辑

Fire Base数据库循环的C#脚本不是逻辑,c#,firebase,unity3d,firebase-realtime-database,C#,Firebase,Unity3d,Firebase Realtime Database,我在Unity中获得了这个FireBase数据库查询脚本,以返回JSON数据库中的行数 我不理解它在脚本中循环的方式,我想在它完成循环但不工作后调用函数CalledFunction()。。。它总是在运行时拾取该函数。为什么在它完全进入和退出函数之前,它会到达“输入4” 请注意,访问数据库时会忽略日志中的错误 public void Start() { Debug.Log("IN 0"); // Get the root reference location o

我在Unity中获得了这个FireBase数据库查询脚本,以返回JSON数据库中的行数

我不理解它在脚本中循环的方式,我想在它完成循环但不工作后调用函数
CalledFunction()
。。。它总是在运行时拾取该函数。为什么在它完全进入和退出函数之前,它会到达“输入4”

请注意,访问数据库时会忽略日志中的错误

public void Start()
{
    Debug.Log("IN 0");
    // Get the root reference location of the database
    FirebaseDatabase.GetInstance("https://THISISMYDATABASEPRIVATELINK.com").GetReference("COUNT LIST").GetValueAsync().ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            Debug.Log("ERROR IN FIREBASE LINK ACCESS");
        }
        else if (task.IsCompleted)
        {
            Debug.Log("IN 1");
            DataSnapshot snapshot = task.Result;
            string count = snapshot.ChildrenCount.ToString();
            Debug.Log("STRING COUNT : " + count);
            FireBaseData.intcount = System.Int32.Parse(count);
            Debug.Log("IN 2");
        }
        Debug.Log("IN 3");
    });

    Debug.Log("IN 4");
    CalledFunction();
}

public void CalledFunction()
{
    Debug.Log("This is Something Else");
}
这是我的输出日志


正如名字所说,
GetValueAsync
是异步执行的。。意思是在一个不同的(类似于线程)和它本身是一个非阻塞调用

因此,线路

Debug.Log("IN 4");
CalledFunction();
不是延迟而是立即到达并执行


如果您想等待调用
CalledFunction
直到返回数据库结果,您更愿意做的是将方法调用移动到异步任务的等待器中

对于Unity特定,请确保不要使用
ContinueWith
,而是使用扩展方法,该方法还可以确保在Untiy主线程中执行回调,这样您就可以使用Unity API而不会出现线程问题

public void Start()
{
    Debug.Log("IN 0");
    // Get the root reference location of the database
    FirebaseDatabase.GetInstance("https://THISISMYDATABASEPRIVATELINK.com").GetReference("COUNT LIST").GetValueAsync().ContinueWithOnMainThread(task =>
    {
        if (task.IsFaulted)
        {
            Debug.Log("ERROR IN FIREBASE LINK ACCESS");
        }
        else if (task.IsCompleted)
        {
            Debug.Log("IN 1");
            DataSnapshot snapshot = task.Result;
            string count = snapshot.ChildrenCount.ToString();
            Debug.Log("STRING COUNT : " + count);
            FireBaseData.intcount = System.Int32.Parse(count);
            Debug.Log("IN 2");

            CalledFunction();
        }
    });
}

public void CalledFunction()
{
    Debug.Log("This is Something Else");
}

你的回答是有道理的,但现在我错过了一些别的。。。Assets\Scripts\FireBaseData.cs(27113):错误CS1061:“DatabaseReference”不包含“ContinueWithInMainThread”的定义,并且找不到可访问的扩展方法“ContinueWithInMainThread”接受类型为“DatabaseReference”的第一个参数(是否缺少using指令或程序集引用?)您可能忘记了
GetValueAsync
?我忘记了,没错,我还将ContinueWithInMainThread更改为ContinueWithInMainThread您是否可以将您的问题作为文本而不是屏幕截图包含日志输出?此处要求不要将图像用于文本内容,请参阅和了解原因。但我认为在调用
CalledFunction()
之前,您需要等待该任务,例如,使用另一个
ContinueWith()
或重新构造
Start())
方法为
异步
并直接等待它。如果需要在主线程上继续,请参阅。有关Unity3d/Firebase中异步任务的一般说明,请参阅