从其他线程调用主线程中的方法

时间:2012-12-29 10:36:19

标签: c# multithreading unity3d

我在unity3d控制台中收到这样的错误:

  

INTERNAL_CALL_Internal_InstantiateSingle只能从主线程调用。   加载场景时,将从加载线程执行构造函数和字段初始值设定项。   不要在构造函数或字段初始值设定项中使用此函数,而是将初始化代码移动到唤醒或启动函数。

我正在尝试的是执行方法,它似乎在主线程中定义,如“Instantiate()”

如何调用此方法或调用主线程来执行它?

修改

protected static void processCommand(String data) {
    ...
    } else if(data.StartsWith("LOGGEDIN")) {
        ...
        Vector3 pos = new Vector3(0, 1.2F, 0);
        Quaternion rot = Quaternion.identity;
        myModel = (GameObject)Instantiate(player, pos, rot);
...

,主题是:

Thread tidListen = new Thread(new ThreadStart(ListenThread));
tidListen.Start();

private static void ListenThread() {
        while(connected) {
            int lData = myStream.Read(myBuffer, 0, client.ReceiveBufferSize);
            String myString = Encoding.ASCII.GetString(myBuffer);
            myString = myString.Substring(0, lData);
            processCommand(myString);
        }
    }

当我调用processCommand时,我有方法:Instantiate()

编辑2

我也试过这个Link,当我从currentThread获得ManagedThreadId时我得到1(这似乎是主线程),但我又得到了同样的错误。

2 个答案:

答案 0 :(得分:1)

要跳过这个,我为来自服务器的消息实现了一个队列系统。

答案 1 :(得分:-2)

Instantiate()StartCoroutine()一样,只能从Unity管理内存中的对象调用 - 即场景游戏对象中的MonoBehaviours。

我相信您的protected static void processCommand(String data)无法调用GameObject.Instantiate(),因为processCommand()不在场景中存在的对象上(因此继承自MonoBehaviour)。我认为这是因为静态方法(对象)不能作为场景中的实例存在。

尝试制作一个在场景中挂起的“实例化”对象,然后为Instantiate()调用。