Unity子线程与主线程交互二(事件监听)

Unity  Api无法从子线程访问, 但有些操作(例:IO存取文件)又必须子线程运行, 故实现在子线程做耗时操作, 完成后通知主线程更新状态

 

以事件监听方式完成交互,规避无限回调地狱

 

如何注册丶调用事件:

        var event1 = "event1";
        var event2 = "event2";
        var thread = Unity.Threading.EasyThread.GetInstance();
        //注册主线程监听
        thread.mainRemote.On(event1, () =>
        {
            //Main Thread Event
            //...

            //移除监听
            thread.mainRemote.Remove(event1);
        });
        thread.mainRemote.On<string>(event2, (data) =>
        {
            //Main Thread Event
            //...

            //移除监听
            thread.mainRemote.Remove(event2);
        });
        //注册子线程监听
        thread.childRemote.Once(event2, () =>
        {
            //Child Thread Event
            //...

            //推送事件到主线程
            //参数: 参数个数丶类型必须与监听者一致
            thread.mainRemote.Send(event1);
            thread.mainRemote.Send(event2, "ChildTread To MainThread Event");
        });

        //推送子线程事件,激活子线程监听方法
        thread.childRemote.Send(event2);

 

代码类:

namespace Unity.Threading
{
    using System;
    using System.Threading;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using SystemThread = System.Threading.Thread;
    using System.Reflection;

    public delegate void Callback(params object[] args);
    //监听者
    internal class Listener
    {
        public string eventName;
        public string funcname;
        public object target;
        public MethodInfo targetMethod;
        public int count;
    }
    //数据包(事件数据)
    internal class EventData
    {
        public Listener listener;
        public string eventName;
        public object[] args;
    }
    //事件系统
    public class EventMgr
    {
        //监听者列表
        private Dictionary<string, List<Listener>> events = new Dictionary<string, List<Listener>>();
        //事件数据(缓冲列表)
        private LinkedList<EventData> firedDatas = new LinkedList<EventData>();
        //调用列表(如果直接使用firedDatas列表,在完成所有调用前,将会阻塞整个事件系统)
        private LinkedList<EventData> doingDatas = new LinkedList<EventData>();

        //暂停事件调用?
        public bool pause = false;


        //注册一个事件监听, 默认不取消监听
        public void On(string event_name, Callback handler)
        {
            On(event_name, handler.Target, handler.Method.Name);
        }
        public void On(string event_name, Action handler)
        {
            On(event_name, handler.Target, handler.Method.Name);
        }
        public void On<T>(string event_name, Action<T> handler)
        {
            On(event_name, handler.Target, handler.Method.Name);
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值