我试图更深入地了解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
}
我只是不知道把收益放在哪里。 有人知道吗?
提前谢谢。答案 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());'
个行数,直到加载完所有数据。