namespace BigoAds.Scripts.Common { using System; using System.Collections.Generic; using UnityEngine; /// /// The unity thread dispatcher. /// [DisallowMultipleComponent] internal sealed class BigoDispatcher : MonoBehaviour { private static bool _instanceCreated; // The thread safe task queue. private static readonly List PostTasks = new List(); // The executing buffer. private static readonly List Executing = new List(); static BigoDispatcher() { CreateInstance(); } /// /// Work thread post a task to the main thread. /// public static void PostTask(Action task) { lock (PostTasks) { PostTasks.Add(task); } } /// /// Start to run this dispatcher. /// [RuntimeInitializeOnLoadMethod] private static void CreateInstance() { if (_instanceCreated || !Application.isPlaying) return; var go = new GameObject( "BigoDispatcher", typeof(BigoDispatcher)); DontDestroyOnLoad(go); _instanceCreated = true; } private void OnDestroy() { lock (PostTasks) { PostTasks.Clear(); } Executing.Clear(); } private void Update() { lock (PostTasks) { if (PostTasks.Count > 0) { Executing.AddRange(PostTasks); PostTasks.Clear(); } } foreach (var task in Executing) { try { task(); } catch (Exception e) { Debug.LogError(e.Message, this); } } Executing.Clear(); } } }