首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用C#的Firebase中的函数时,for循环停止

调用C#的Firebase中的函数时,for循环停止
EN

Stack Overflow用户
提问于 2020-12-09 19:59:24
回答 2查看 137关注 0票数 0

我有一个与迭代DataSnapShot.Children将停止代码的执行(统一,Firebase)类似的问题,这个问题的解决方案也帮助我使我的代码工作。但是,我还想调用一个函数,它在for循环的每一次迭代中都创建一个新的GameObject。如果函数只包含一个“callForEachElement”语句,那么for循环似乎在每次迭代中调用-function()。一旦我试图在函数中实例化一个对象,for循环就会在第一个调用之后停止,而不会实例化该对象。在下面的代码中,调用了Debug.Log(“实例化之前”),而从未调用Debug.Log(“实例化后”)。如果我想这样做的话,谁能解释为什么这个循环不能工作,为什么循环只运行一次呢?

代码语言:javascript
运行
复制
public GameObject prefab;

private void loadEntriesFromServer()
    {
        FirebaseDatabase.DefaultInstance.GetReference("202012").GetValueAsync().ContinueWith(task =>
         {
             if (task.IsFaulted)
             {
                 // Handle the error...
                 Debug.Log("ERROR IN LOAD ENTRIES");
             }
             else if (task.IsCanceled)
             {
                 Debug.Log("Task was Cancelled");
             }
             else if (task.IsCompleted)
             {
                 DataSnapshot snapshot = task.Result;

                 using (var sequenceEnum = snapshot.Children.GetEnumerator())
                 {
                     for (int i = 0; i < snapshot.Children.Count(); i++)
                     {
                         while (sequenceEnum.MoveNext())
                         {
                             try
                             {
                                 IDictionary dictUser = (IDictionary)sequenceEnum.Current.Value;
                                 Debug.Log("displayName:" + dictUser);
                                 callForEachElement();

                             }
                             catch (System.Exception e)
                             {
                                 Debug.Log(e.Message);
                             }
                         }
                     }
                 }
             }
         });


    void callForEachElement()
    {
        Debug.Log("Before instantiation");
        GameObject obj = Instantiate(prefab) as GameObject;
        Debug.Log("After instantiation");
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 23:46:06

不能保证ContinueWith在主线程上运行,您只能在主线程上安全地运行Instantiate。考虑将实例化循环移到任务之外,或者尝试Firebase扩展ContinueWithOnMainThread,描述为这里

例如。

代码语言:javascript
运行
复制
FirebaseDatabase.DefaultInstance.GetReference("202012").GetValueAsync().ContinueWithOnMainThread(task
票数 1
EN

Stack Overflow用户

发布于 2020-12-09 20:12:21

我想您在Instantiate(prefab)语句中所做的事情可能会导致来自FirebaseDatabase.DefaultInstance.GetReference("202012").GetValueAsync()及其子任务的任务被取消。

使用取消令牌调用ContinueWith()方法,这样您就可以看到情况是否如此。

关于任务星座的信息

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65224002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档