Monobehavior中的事件是单线程吗?因此,当我捕获事件的触发器时,如果其中一个侦听器具有异常,则将触发该事件的try catch。我假设一旦A类触发一个事件,该线程将遍历每个用户,在每个用户完成后,A类继续?
public class EventExample : MonoBehaviour
{
public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;
public void Start NextTurn()
{
try{
if (OneDayPassed != null)
OneDayPassed();
}
catch(Exception e){
// will catch error here
}
}
}
public class EntityWatcher: MonoBehaviour
{
void Start()
{
EventExample.OneDayPassed += this.PrepareNextDay;
}
public void PrepareNextDay()
{
int test = int.parse("error");
}
}
答案 0 :(得分:2)
Monobehavior
主要是单线程但有些少数回调函数不是。 Unity API回调函数的大多数将在主线程上进行。
这些是不会在主线程上调用的功能,这意味着您无法在这些功能中调用/使用Unity API:
Application.RegisterLogCallbackThreaded
Application.logMessageReceivedThreaded
活动OnAudioFilterRead
Monobehavior
回调函数。至于你自己的自定义事件,如:
public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;
在您调用它的线程上调用该事件。如果从main / MonoBehaviour线程调用它,则回调将在主线程上发生。如果你创建一个新的Thread
并从那里调用它或者使用上面列出的3个函数中的任何一个,那么期望它在另一个 Thread
上调用,而不是主Thread
1}}。
如果您需要使用来自主Thread
以外的其他Thread
的Unity的API,请参阅this发布。
答案 1 :(得分:1)
Unity的事件API是单线程的。而且,它不是为支持多线程而设计的(不是线程安全的)。
当然,如果需要,您可以使用多线程明确委派一些工作,但不要尝试使用这些工具调用Unity API。
您可以在此处获得更多信息:https://answers.unity.com/questions/180243/threading-in-unity.html
如果您需要依赖某些执行顺序,可以参考manual page here