C# 在Update()中引发通过网络接收的事件的优雅方式

C# 在Update()中引发通过网络接收的事件的优雅方式,c#,unity3d,networking,event-handling,C#,Unity3d,Networking,Event Handling,我正在写一个Unity3D游戏,它从外部来源获取网络事件。实际的网络读取操作在它们自己的线程中 当我从网络中读取某个项时,我希望MonoBehavior在下一次Update()调用中使用该项作为参数来调用某个函数。下面是我现在如何做到这一点的(为了简单起见,只需编写伪代码) 网络线程 OtherScript script; while true { Thing thing = Network.read() script.queue.put(thing); } public st

我正在写一个Unity3D游戏,它从外部来源获取网络事件。实际的网络读取操作在它们自己的线程中

当我从网络中读取某个项时,我希望MonoBehavior在下一次
Update()
调用中使用该项作为参数来调用某个函数。下面是我现在如何做到这一点的(为了简单起见,只需编写伪代码)

网络线程

OtherScript script;
while true {
    Thing thing = Network.read()
    script.queue.put(thing);
}
public static event EventHandler<NetworkArg>RaiseNetwork;
protected void OnNetwork(NetworkArg arg)
{
     if(RaiseNetwork != null) { RaiseNetwork(this, arg); }
}
while true {
    Thing thing = Network.read()
    RaiseNetwork(new NetworkArg(thing));
}
单一行为(其他脚本)

同步队列;
无效更新(){
while!queue.isEmpty(){
useThing(queue.pop())
}
}
这肯定是可行的,但我的问题是我订阅了20多种不同类型的东西,每种东西都有自己的队列和自己的“回调”函数,导致了大量的样板文件


是否有某种内置机制可以自动实现此功能?

您的解决方案似乎在您的问题中。您可以使用事件来代替

网络线程

OtherScript script;
while true {
    Thing thing = Network.read()
    script.queue.put(thing);
}
public static event EventHandler<NetworkArg>RaiseNetwork;
protected void OnNetwork(NetworkArg arg)
{
     if(RaiseNetwork != null) { RaiseNetwork(this, arg); }
}
while true {
    Thing thing = Network.read()
    RaiseNetwork(new NetworkArg(thing));
}
单一行为(其他脚本)


看起来非常好,但这是否保证在Update()期间引发事件?或者至少在另一个合法的时间,MonoBehavior在不引入竞争条件的情况下运行。如果您需要在特定的MB回调中调用它,那么在侦听器中设置一个标志,并在回调中设置一个进程。我认为这在功能上与我当前的方法类似。我想我想知道的是,Unity的人是否设计了一个更好的解决方案,不需要那么多样板文件。如果您使用Unet系统,那么SyncVar可能很接近。恐怕不是,只是原始套接字。我想我要找的东西可能根本不存在。
void Start()
{
    NetworkThread.RaiseNetwork += UseThing;
}
private void UseThing (object sender, NetworkArg arg){ }