您的当前位置:首页正文

Unity3d UI线程与其它线程之间的交互

来源:华拓网
  1. 获取UI线程的SynchronizationContext的实例
    在UI线程调用异步方法时,可以在UI线程中直接使用
SynchronizationContext.Current

获取当前UI线程的SynchronizationContext 实例。

  1. 调用回调方法
    在SynchronizationContext类中有两个方法,一个是Send方法,一个是Post方法。
  • Send() 是简单的在当前线程上去调用委托来实现(同步调用)。也就是在子线程上直接调用UI线程执行,等UI线程执行完成后子线程才继续执行。
  • Post() 是在线程池上去调用委托来实现(异步调用)。这是子线程会从线程池中找一个线程去调UI线程,子线程不等待UI线程的完成而直接执行自己下面的代码。
    所以在使用异步方法的时候,需要把SynchronizationContext的实例传过去,在调用UI回调方法时,使用Send方法调用,如下面代码所示:
 public void ConnectServer(Action<SocketStateEnum> callback)
    {
        //异步执行socket的连接
        networkStatusExecutor.Execute(() =>
        {
            try
            {
                Debug.Log("开始连接服务器:" + host + ":" + port);
                clientSocket.ConnectServer();
                Debug.Log("连接服务器成功:" + host + ":" + port);
                //使用UI线程的SynchronizationContext实例调UI的回调
               uiContext.Send((state) =>
                {
                    Debug.Log("连接成功之后回调线程:" + Thread.CurrentThread.ManagedThreadId);
                    callback.Invoke(SocketStateEnum.ConnectSuccess);
                }, null);
                //启动异步接收数据
                receiveExecutor.Execute(() =>
                {
                    messageReader.ReadData((byteBuf) =>
                    {
                        serverMessageDispatch.DispatchMessage(byteBuf);
                    });
                });
            }
            catch (Exception e)
            {
                uiContext.Send((state) =>
                {
                    callback.Invoke(SocketStateEnum.ConnectFailed);
                }, null);
                Debug.Log("网络连接失败,请检测网络," + e);
            }
        });
    }

这个是一个异步连接socket的代码,在连接成功之后,可能会更新一些UI上面的展示,所以使用UI的SynchronizationContext调用回调方法。


欢迎关注,获取更多资源