86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace BigoAds.Scripts.Common
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections.Generic;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     /// <summary>
 | |
|     /// The unity thread dispatcher.
 | |
|     /// </summary>
 | |
|     [DisallowMultipleComponent]
 | |
|     internal sealed class BigoDispatcher : MonoBehaviour
 | |
|     {
 | |
|         private static bool _instanceCreated;
 | |
| 
 | |
|         // The thread safe task queue.
 | |
|         private static readonly List<Action> PostTasks = new List<Action>();
 | |
| 
 | |
|         // The executing buffer.
 | |
|         private static readonly List<Action> Executing = new List<Action>();
 | |
| 
 | |
|         static BigoDispatcher()
 | |
|         {
 | |
|             CreateInstance();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Work thread post a task to the main thread.
 | |
|         /// </summary>
 | |
|         public static void PostTask(Action task)
 | |
|         {
 | |
|             lock (PostTasks)
 | |
|             {
 | |
|                 PostTasks.Add(task);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Start to run this dispatcher.
 | |
|         /// </summary>
 | |
|         [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();
 | |
|         }
 | |
|     }
 | |
| } |