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);
}