繁体   English   中英

等待其他功能完成时,协程是否正确?

[英]Is coroutine the right way to go, when waiting for other functions to complete?

试图找出协程是否是正确的方法。

我有3个不同的类来执行操作。 我希望这3个类以任何顺序进行工作,一旦完成这3个类,我就可以进入下一个循环并再次调用这3个类中的方法以重新开始。

像现在一样,每个类中都有一个方法可以完成工作; 在主类中,我创建了一个协程,这是我的过程的主要循环。 协程的条件是必须完成3类中的所有3种方法,并在while循环中返回return void。 这是协程的简化版本:

IEnumerator void loopFunction()
{
    while (!classA.method() && !classB.method() && !classC.method())
    {
        yeld return void;
    }
    // do some updates
    // start all over again
}

这将被正确实施还是我应该使用其他方法? 目的是要有一个每X秒执行一次的循环,并且仅当其中的所有方法完成时才开始一个新循环。

编辑:

浏览时,我发现实际上可以使用多线程,这是您的旧“ System.Threading”方式,因为Unity仅支持Net 3.5。

线程似乎是另一个可行的选择。 尽管我听说Unity本身不是线程安全的,但是我不确定是否可以在协程内部将不同类中的函数作为单独的线程运行。

这取决于这些方法将如何与您的游戏其余部分进行交互。 协程提供一种并发形式,而线程提供一种并行性形式。

仅在确实需要并行化操作的情况下才使用线程,因为其余协程都很好。

协程简单地提供了一种机制,该机制可组成独立执行的代码块,其中该执行是交错执行的,而不是并行执行的。 协程与任何其他常规方法/功能之间基本上没有区别,只是它能够(轻松)在特定期间中止执行。

简而言之,协程与结构有关,线程与执行有关。 如果您只是想将一组操作分布在多个框架上,那么协程提供了一种不错的方法。 协程在主线程上执行,因此,只要您的三个方法都在运行,游戏的其他部分将被暂停-您的代码将控制“挂起”动作。

如果您的应用程序运行在可以并行化操作(多核或多处理器)的硬件平台上,并且您想利用这种潜力,请查看线程。 或者,如果您使用第3方库,并且无法控制特定操作花费的时间(并且花费的时间太长),那么您也可以考虑使用线程。 显然,这带来了一些额外的复杂性,请记住,Unity不是线程安全的,因此,如果您的操作以任何方式与Unity API进行交互,则需要注意通过某种锁定适当地同步您的方法。 不要直接从另一个线程访问Unity对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM