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