先完成一种方法,然后再开始另一种方法

问题描述 投票:0回答:1

我正在为我的 Unity 程序编写

C#
代码。

我正在通过

IEnumerator searchInDatabase(string sql)
函数获取数据。

我会按

getDatabaseValue()
来呼叫
A

代码如下。


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A)) getDatabaseValue("select * from table;", 0, 0);
    }

 IEnumerator searchInDatabase(string sql)
 {
     queryCompleted = false;
     WWWForm database = new WWWForm();
     database.AddField("sqlpost", sql);

     using (UnityWebRequest www = UnityWebRequest.Post("myDatabase", database))
     {
         yield return www.SendWebRequest();
         string[] entries = www.downloadHandler.text.Split(",|");
         result = new string[entries.Length, entries[0].Split(',').Length];
         for (int i = 0; i < entries.Length; i++)
         {
             string[] parts = entries[i].Split(',');
             for (int j = 0; j < parts.Length; j++)
             {
                 result[i, j] = parts[j];
             }
         }
         queryCompleted = true;
         yield return result;
     }
     Debug.Log("Query Completed");
 }

 public string getDatabaseValue(string sql, int x, int y)
 {
     try
     {
         Debug.Log("Waiting 00");

         StartCoroutine(searchInDatabase(sql));
         
         Debug.Log("getting result data");
         return result[x, y];
     }
     finally { }
     //catch (Exception ex) { Debug.LogWarning(ex.StackTrace); }
   //  return result[0, 0];
 }

然而,我得到的结果是

Waiting 00
getting result data
Result = 1   // (<-- result from previous query statement) 
Query Completed

我期望结果应该是先完成查询,然后再从

result
获取数据。

我的预期输出如下:

Waiting 00
Query Completed
getting result data
Result = 2 //(<--result from this query statement)
c# unity-container ienumerator
1个回答
0
投票

您使用

StartCoroutine
来启动协程。 Unity中协程的描述是这样的:

可以使用yield 语句随时暂停协程的执行。当使用yield语句时,协程会暂停执行并在下一帧自动恢复。有关更多详细信息,请参阅协程文档。

因此,当

getDatabaseValue
调用
searchInDatabase
时,
searchInDatabase
方法将在该行暂停:

yield return www.SendWebRequest();

然后程序会返回到

getDatabaseValue
,继续执行下一行:

Debug.Log("getting result data");

作为一个可能的解决方案,您可以像这样生成

StartCoroutine
的返回值:

yield return StartCoroutine(searchInDatabase(sql));

如果您执行此修复,您应该检查调用

getDatabaseValue
的代码是否有相同的问题。

还有更多相关信息: MonoBehaviour.StartCoroutine

本页中的第一个示例与您的代码类似,第二个示例是您所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.