在 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.