Unity中关于多线程的一些事

一.线程中不允许调用unity组件api

解决方法:可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API.

二.打印并且将信息输出到list列表中

多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。

三.启用socket连接server

在主线程中直接连接server,如果网络通信正常,程序运行也正常。但是如果网络中断或者连接较慢,就会出现程序卡顿。所以要在启动一个线程来连接server。并在连接server成功后启动一个新的线程来接听server给客户端发送的消息。

即 thread1启动连接socket。thread2启动监听。

        thread1 = new Thread(Connect);
        thread1.IsBackground = true;
        thread1.Start();
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress iPAddress = IPAddress.Parse(ip);
            IPEndPoint point = new IPEndPoint(iPAddress, port);
            socketSend.Connect(point);
            LogManager.Instance.ShowLog("连接成功 , " + " ip = " + ip + " port = " + port);
            thread2= new Thread(Received);
            thread2.IsBackground = true;
            thread2.Start();

但是当我们stop run unity,然后再次run unity的时候我们会发现编辑器在不断加载脚本,会卡很久。经过多次测试我发现是线程没有结束。所以要在OnDisable时将线程中断。

 void CloseAll()
    {
        //这里要先终止线程  在终止socket 
        //不然会报错 SocketException: 一个封锁操作被对 WSACancelBlockingCall 的调用中断

        if (thread2!= null)
        {
            try
            {
                thread2.Abort();
            }
            catch (Exception e)
            {
                Debug.Log(e.Message);
            }
        }

        if (thread1!= null)
        {
            try
            {
                thread1.Abort();
            }
            catch (Exception e)
            {
                Debug.Log(e.Message);
            }

        }
if (socketSend!=null&&socketSend.Connected)
        {
            try
            {
                socketSend.Shutdown(SocketShutdown.Both);   
                socketSend.Close();                         
            }
            catch (Exception e)
            {
                Debug.Log(e.Message);
            }
        }
    }

注意一定要先中断thread2,在中断thread1.不然unity还是会不断reload scrip,使编辑器卡在那里。

Unity中关于多线程的一些事_第1张图片

你可能感兴趣的:(unity,游戏引擎)