为什么" InvokeOnAppThread"用过的?

时间:2017-09-26 04:34:45

标签: c# multithreading unity3d

(问题如下,但请阅读以下信息)

根据documentation InvokeOnAppThread在应用程序线程上执行回调项。

浏览更多documentation ,似乎有" UI线程"和#34;应用程序线程"。

然而,他们提供的关于此的更多信息的链接并不存在。

那么,在任何Unity程序中默认有两个线程吗?有人可以向我解释一下InvokeOnAppThread吗?应该使用何时以及何时使用?

(我已经搜索并查看了Unity中处理线程的页面。很明显默认情况下有一个UI线程,似乎不建议使用多线程,因为其他线程不允许访问UI线程。据我了解这可以通过使用回调来解决) - 所以我已经对此进行了研究

"应用程序线程"文档中提到的其他地方没有提到

为了避免重复,我已经搜索了SO,如果已经有答案的话。 search输出结果为0,因此我很清楚,不是重复的问题

2 个答案:

答案 0 :(得分:2)

看起来this是应该从断开的链接到达的页面。

从该页面开始:

  

现在,让我们仔细看看AppCallbacks类。当你创建   它,你指定你的游戏将在不同的线程上运行,为   向后兼容的原因你也可以指定你的   应用程序可以在UI线程上运行,但不建议这样做,因为   微软有限制 - 如果你的申请没有   在5秒后变得敏感,你将无法通过WACK(Windows   应用认证),在这里阅读更多 -   http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh184840(v=vs.105).aspx,   想象一下,如果你的第一级很大,那可能会很重要   加载它的时间,因为您的应用程序在UI上运行   线程,UI将无响应,直到您的级别完全加载。   这就是为什么建议总是在不同的线程上运行你的游戏。

从WinRT / UWP运行时的角度来看,'UI线程'本质上是主线程。为了不阻塞该线程,所有特定于Unity的代码 - MonoBehaviour脚本,协同程序等 - 在一个单独的线程上运行,即'应用程序线程',这是从Unity的角度来看的主线程发动机。

如果您使用的是Unity的主线程,并且想要在Windows UI线程上执行某些操作(例如,创建本机弹出窗口),则可以使用InvokeOnUIThread。如果您在UI线程上并且希望编组回Unity主线程(例如,启动协程,实例化GameObject),则调用InvokeOnAppThread

答案 1 :(得分:0)

我不熟悉Unity,但这是在您使用的任何框架中使用WinForms开发的典型要求。

您可以在Control.InvokeRequired property documentationthis MSDN page中找到问题的详细说明。

解释说的是控件的事件只能由创建它们的线程处理,否则它们不是线程安全的。这与我过去所理解的指导略有不同 - 您的主UI线程只是监听事件并将它们交给ThreadPool进行处理,以便用户响应(即响应鼠标/键盘事件)永远不会停止,因为该应用程序正在做一些事情

Control.InvokeRequired检查应该告诉您是否在UI线程上,以便您可以对另一个应该在另一个线程上执行的事件进行排队,这样主UI处理线程就不会阻塞。自从我上次使用它以来,实现细节可能已经有所改变。