Unity3d Parse FindAsync方法冻结UI

时间:2015-05-07 19:34:59

标签: unity3d parse-platform

我正在运行一个简单的Parse FindAsync方法,如下所示(在Unity3d上):

        Task queryTask = query.FindAsync();
        Debug.Log("Start");
        Thread.Sleep(5000);
        Debug.Log("Middle");
        while (!queryTask.IsCompleted) {
                Debug.Log("Waiting");
                Thread.Sleep(1);
        }
        Debug.Log("Finished");

我在一个单独的线程上运行此方法,并在UI上添加了一个加载圈。我的负载在Thread.sleep方法的中间某处冻结(+ - 1秒)。看起来当findAsync完成该过程时,它会冻结UI直到完成工作。有什么我可以做的吗?

Ps:这在编辑器上完美运行,问题出在Android设备上。

Ps2:我正在运行解析1.4.1

Ps3:我​​已经尝试了continueWith方法,但同样的问题也发生了。

2 个答案:

答案 0 :(得分:2)

IEnumerator RunSomeLongLastingTask () {

    Task queryTask = query.FindAsync();
    Debug.Log("Start");
    //Thread.Sleep(5000); //Replace with below call
    yield WaitForSeconds(5); //Try this

    Debug.Log("Middle");
    while (!queryTask.IsCompleted) {
        Debug.Log("Waiting");
        //Thread.Sleep(1);
        yield WaitForSeconds(0.001f);
    }
    Debug.Log("Finished");
}

要调用此功能,请使用:

StartCoroutine(RunSomeLongLastingTask());

答案 1 :(得分:2)

让线程休眠可能不是一个好主意,主要是因为每个设备上可用的线程数不同。

Unity作为使用协同程序的内置调度程序,因此最好使用它。

IEnumerator RunSomeLongLastingTask()
{
    Task queryTask = query.FindAsync();
    while (!queryTask.IsCompleted)
    {
        Debug.Log("Waiting"); // consider removing this log because it also impact performance
        yield return null; // wait until next frame
    }
}

现在,一个可能的问题是,如果您的任务占用太多CPU,那么UI仍然无法响应。如果可能,请尝试优先考虑此任务。