67 lines
1.5 KiB
C#
67 lines
1.5 KiB
C#
using System.Collections.Concurrent;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using System;
|
|
|
|
public class UnityMainThreadDispatcher : MonoBehaviour
|
|
{
|
|
private static UnityMainThreadDispatcher instance;
|
|
private readonly ConcurrentQueue<Action> actionQueue = new ConcurrentQueue<Action>();
|
|
|
|
|
|
public static void Initialize()
|
|
{
|
|
if (instance == null)
|
|
{
|
|
var go = new GameObject("UnityMainThreadDispatcher");
|
|
//DontDestroyOnLoad(go);
|
|
instance = go.AddComponent<UnityMainThreadDispatcher>();
|
|
}
|
|
}
|
|
public static UnityMainThreadDispatcher Instance
|
|
{
|
|
get
|
|
{
|
|
if (instance == null)
|
|
{
|
|
var go = new GameObject("UnityMainThreadDispatcher");
|
|
//DontDestroyOnLoad(go);
|
|
instance = go.AddComponent<UnityMainThreadDispatcher>();
|
|
}
|
|
return instance;
|
|
}
|
|
}
|
|
|
|
public void Enqueue(Action action)
|
|
{
|
|
actionQueue.Enqueue(action);
|
|
}
|
|
|
|
public Task EnqueueAsync(Action action)
|
|
{
|
|
var tcs = new TaskCompletionSource<bool>();
|
|
|
|
actionQueue.Enqueue(() =>
|
|
{
|
|
try
|
|
{
|
|
action();
|
|
tcs.SetResult(true);
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
tcs.SetException(e);
|
|
}
|
|
});
|
|
|
|
return tcs.Task;
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
while (actionQueue.TryDequeue(out var action))
|
|
{
|
|
action();
|
|
}
|
|
}
|
|
} |