我有以下代码......
StartCoroutine(GetSuggestions());
IEnumerator GetSuggestions() {
longExecutionFunction(); // this takes a long time
yield return null;
}
如何使用协程来保持主程序的流程?目前它到达longExecutionFunction();程序停止几秒钟。如果整个程序在这个过程中继续工作,我会喜欢它。我怎么能这样做?
答案 0 :(得分:2)
不使用线程,假设您可以修改longExecutionFunction
,它看起来像这样:
void longExecutionFunction()
{
mediumExecutionFunction();
mediumExecutionFunction();
while(working)
{
mediumExecutionFunction();
}
}
您可以将其修改为:
IEnumerator longExecutionFunction()
{
mediumExecutionFunction();
yield return null;
mediumExecutionFunction();
yield return null;
while(working)
{
mediumExecutionFunction();
yield return null;
}
}
然后修改调用代码:
StartCoroutine(GetSuggestions());
IEnumerator GetSuggestions() {
yield return longExecutionFunction();
//all done!
}
然后,每次更新都会做一个“中等长度的东西”,让游戏不再挂起。如果你在longExecutionFunction
内分解工作有多精细,取决于你的代码。
答案 1 :(得分:0)
您需要在另一个线程中启动longExecutionFunction。您可能需要查看本文以了解线程:http://msdn.microsoft.com/en-us/library/system.threading.thread.aspx
代码示例:
var thread = new System.Threading.Thread(new System.Threading.ThreadStart(() => {
longExecutionFunction();
}));
thread.Start();
如果您不熟悉线程,则应在使用它们之前阅读它们。 :)
答案 2 :(得分:0)
您应该将Threads与协程结合使用。
StartCoroutine(MyCoroutine());
[...]
IEnumerator MyCoroutine()
{
Thread thread = new Thread(() =>
{
longExecutionFunction();
});
thread.Start();
while (thread.IsAlive) yield return 0;
// ... Use data here
}
但是你不能在longExecutionFunction
内使用任何统一对象或方法,因为统一不是线程安全的。因此,您需要在longExecutionFunction
内计算所有数据,并在方法返回时初始化unity对象。