我正在运行一个简单的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
方法,但同样的问题也发生了。
答案 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仍然无法响应。如果可能,请尝试优先考虑此任务。