【Unity】在主线程调用

在收到服务器消息时,有可能不是在主线程,所以逻辑需要在主线程中调用才安全,这个类就是用来干这个事的

  • OnUpdate方法需要在Monobehaviour类中进行调用
  • SingletonTemplate为单例模板,自己写一个单例也行
using System;
using System.Collections.Concurrent;
using System.Threading;

/// 
/// 主线程工具类
/// 
public class ThreadManager : SingletonTemplate
{
    private readonly ConcurrentQueue queue = new ConcurrentQueue();

    private readonly  int mainThreadId = Thread.CurrentThread.ManagedThreadId;

    private Action a;

    /// 
    /// 在主线程调用函数
    /// 
    /// 
    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();
        }
    }
}

你可能感兴趣的:(【Unity】在主线程调用)