在收到服务器消息时,有可能不是在主线程,所以逻辑需要在主线程中调用才安全,这个类就是用来干这个事的
- OnUpdate方法需要在Monobehaviour类中进行调用
- SingletonTemplate为单例模板,自己写一个单例也行
using System;
using System.Collections.Concurrent;
using System.Threading;
/// <summary>
/// 主线程工具类
/// </summary>
public class ThreadManager : SingletonTemplate<ThreadManager>
{
private readonly ConcurrentQueue<Action> queue = new ConcurrentQueue<Action>();
private readonly int mainThreadId = Thread.CurrentThread.ManagedThreadId;
private Action a;
/// <summary>
/// 在主线程调用函数
/// </summary>
/// <param name="action"></param>
public void InvokeInMainThread(Action action)
{
if (Thread.CurrentThread.ManagedThreadId == mainThreadId)
{
action.Invoke();
return;
}
queue.Enqueue(action);
}
public void OnUpdate()
{
while (true)
{
if (!queue.TryDequeue(out a))
{
return;
}
a.Invoke();
}
}
}