在 Unity3d 中协程到 运行 SQL
Coroutine to run SQL in Unity3d
我正在尝试更深入地了解 Unity 协程。它们可以阻止执行产生 null 或等待,但它们实际上不是新线程。
在我的例子中,Unity 应该从数据库中读取信息,这可能需要一些时间。这是同步操作。这一行代码可能会阻止执行几秒钟。
我的一部分告诉我要开始新线程。但我想知道是否可以使用 Unity 风格的协程来实现。
private IEnumerator FetchPlayerInfo(int id)
{
// fetch player from DB
using (var session...)
{
// this line is NHibernate SQL query, may take long time
player = session.QueryOver<Player>()...;
}
// raise event to notify listeners that player info is fetched
}
我只是看不出应该把 yield 放在哪里。 有人知道吗?
提前致谢。
您可以将屈服视为将大型任务分解成块。在每个块之后,你让步让其他事情发生,然后回来再做一个 chuck。在您的情况下,您将加载每个块的 X
行数,直到加载所有数据。
当控制流在您自己的协程中时,您只能return yield 指令。如果您必须 运行 一个长时间的同步操作,并且它没有异步 API (这是数据库所期望的),那么您最好启动另一个线程。
但是,请注意在 Unity 中使用其他线程有点棘手:您将无法使用任何 Unity API 并且您必须在主线程中检查何时工作线程已准备好结果。考虑寻找现成的解决方案,例如 Loom.
我正在尝试更深入地了解 Unity 协程。它们可以阻止执行产生 null 或等待,但它们实际上不是新线程。
在我的例子中,Unity 应该从数据库中读取信息,这可能需要一些时间。这是同步操作。这一行代码可能会阻止执行几秒钟。
我的一部分告诉我要开始新线程。但我想知道是否可以使用 Unity 风格的协程来实现。
private IEnumerator FetchPlayerInfo(int id)
{
// fetch player from DB
using (var session...)
{
// this line is NHibernate SQL query, may take long time
player = session.QueryOver<Player>()...;
}
// raise event to notify listeners that player info is fetched
}
我只是看不出应该把 yield 放在哪里。 有人知道吗?
提前致谢。
您可以将屈服视为将大型任务分解成块。在每个块之后,你让步让其他事情发生,然后回来再做一个 chuck。在您的情况下,您将加载每个块的 X
行数,直到加载所有数据。
当控制流在您自己的协程中时,您只能return yield 指令。如果您必须 运行 一个长时间的同步操作,并且它没有异步 API (这是数据库所期望的),那么您最好启动另一个线程。
但是,请注意在 Unity 中使用其他线程有点棘手:您将无法使用任何 Unity API 并且您必须在主线程中检查何时工作线程已准备好结果。考虑寻找现成的解决方案,例如 Loom.