using System; using System.Collections.Generic; using System.Threading; public class AxiNSWaitHandle { static Queue m_QueueReady = new Queue(); static Queue m_QueueWork = new Queue(); public void AddWait(AxiNSWaitBase wait) { lock (m_QueueReady) { m_QueueReady.Enqueue(wait); } if (AxiNS.usedmultithreading) { InitInternalThread(); autoEvent.Set(); } else { InitMonoInit(); } } #region 多线程实现 static AutoResetEvent autoEvent = new AutoResetEvent(false); static Thread waitThread = new Thread(Loop); static bool bSingleInit = false; static void InitInternalThread() { if (bSingleInit) return; waitThread.Start(); bSingleInit = true; } static void Loop() { while (autoEvent.WaitOne()) { Do(); } } #endregion #region 主线程时间间隔实现 static bool bMonoInit = false; static void InitMonoInit() { if (bMonoInit) return; AxiNSMono.SetInvoke(Do,15); bMonoInit = true; } #endregion static void Do() { lock (m_QueueReady) { while (m_QueueReady.Count > 0) { m_QueueWork.Enqueue(m_QueueReady.Dequeue()); } } while (m_QueueWork.Count > 0) { AxiNSWaitBase wait = m_QueueWork.Dequeue(); try { wait.Invoke(); } catch (Exception ex) { wait.errmsg = ex.ToString(); UnityEngine.Debug.Log(ex.ToString()); } wait.SetDone(); } } }