协同在Unity3d中运行SQL

时间:2015-04-28 06:01:42

标签: c# unity3d coroutine

我试图更深入地了解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
}

我只是不知道把收益放在哪里。 有人知道吗?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

当控制流在您自己的协程中时,您只能返回yield指令。如果你必须运行一个长的同步操作,并且它没有异步API(这是数据库所期望的),那么你最好开始另一个线程。

但是,请注意在Unity中使用其他线程有点棘手:您无法使用Unity的任何API,并且您必须检查主线程当工作线程准备好结果时。考虑查看现成的解决方案,例如Loom

答案 1 :(得分:1)

你可以想到屈服于将大型任务分解成块。在每个块之后,你屈服于让其他事情发生,然后再回来做另一个chuck。在您的情况下,您将在每个块中加载`WinWindow samplewindow = new WinWindow(); samplewindow.SearchProperties[WinWindow.PropertyNames.Name] = "XXYYZZZ"; samplewindow.SearchProperties[WinWindow.PropertyNames.ClassName] = "XXYYYZZZ"; WinButton uIButton = new WinButton(samplewindow); uIButton.SearchProperties[WinButton.PropertyNames.Name] = "XXYYYZZZ"; Mouse.Click(uIButton, MouseButtons.Left, System.Windows.Input.ModifierKeys.None, uIButton.GetClickablePoint());' 个行数,直到加载完所有数据。