如何在继续之前等待StartCoroutine()完成

时间:2015-06-29 18:58:51

标签: c# mysql unity3d coroutine

我正在编写一段代码,从MySQL获取一条信息并在UI上显示。问题是,程序不会等待MySQL查询完成并直接显示变量(由于查询结果没有按时完成而变为空)

我的代码的大致轮廓是:

bool notYetDone = true;

StartCoroutine(query(web));

IEnumerator query (WWW web){
    yield return web;
    while(notYetDone == true){
        yield return new WaitForSeconds(1f);
        if(web.error == null){
            //no problems with the query, some code here
            notYetDone = false;
        } else if (web.error != null){
            //some code here for handling errors
        } else {
            Debug.Log("i dont really know why we reached here");
        }
    }
}

我还注意到的一点是它似乎改变了notYetDone的值并立即结束循环。我的代码有问题吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

试试这个:

class QueryBehaviour: MonoBehaviour
{
  bool queryFinished = false;
  WWW wwwQuery;

  IEnumerator Query()
  {
    wwwQuery = new WWW("url_to_query");
    yield return wwwQuery;

    queryFinished = true;
    //results or error should be here
  }

  Update()
  {
    if( queryFinished == false )
    {
      return;
    }
    else
    {
      //use wwwQuery here
    }
  }
}

然后只需拨打查询

注意:如果您调用 yield return wwwQuery ,则无需忙碌等待。如果你不想这样做,你应该等待,例如,你想要检查进度下载,在这种情况下你应该在定义的更新方法中查询www类的结果在 MonoBehaviour

答案 1 :(得分:1)

尝试:

IEnumerator query (WWW web)
{
   //yield return web;
   while(!web.isDone && web.Error == null)
   {
    //this will loop until your query is finished
    //do something while waiting...
      yield return null;
   }
   if(web.Error != null)
     Debug.Log("Errors on web");

}

答案 2 :(得分:1)

在startcoroutine之前放置yield关键字也会产生相同的效果。在你的情况下:

yield StartCoroutine(query(web)); 
//at this point it is guaranteed to be completed

the extension

答案 3 :(得分:1)

如何使用回调?

dim a as string
dim b as string
a ="hello world"
b = IIF(a="hello world", "Yes", "No")

警告,这种方式需要使用支持 Action 类的.NET版本。