Unity3D多线程加载技术在iOS上的实现


1.在C#中使用线程池需要以下这个类库using System.Threading

2.开单个线程(unity程序停止前 线程一定要关闭)

登录后复制


private Thread tempThread;
    void Start () {
        tempThread = new Thread(MyThread);//将方法注册到线程句柄当中,注意保留这个句柄,最后需要关闭线程,要不然会造成unity停止运行线程不停止。
        tempThread.Start();//开启线程。
    }
    //这是线程方法
    private void MyThread()
    {
        Debug.Log("开了线程");
    }
    
    

关闭线程(Thread.Abort();)

3.线程池的使用

线程池相对于线程而言更加方便,在线程池中的线程是由系统进行统一管理,我们在使用的过程中不需要自己去对线程进行开关操作,这些系统都会给我们做了。而且线程池还有一个好处,就是可以传参!

登录后复制


private int m_iParam;//随便一个类型的参数
    void Start () {
        ThreadPool.QueueUserWorkItem(new WaitCallback(MyThread), m_iParam);//将方法添加进线程池,并传入参数
    }
    private void MyThread(object param)
    {
        Debug.Log("开了线程");
    }
    
    

也可以封装成方法

登录后复制


//线程池上的队列
    public static void QueueOnThreadPool(WaitCallback callBack, object state = null)
    {
        ThreadPool.QueueUserWorkItem(callBack, state);
    }
    
    

c#脚本

登录后复制


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading;
using System;

public class XianCheng : MonoBehaviour
{
    public static XianCheng Current;
    static Thread mainthread;  //主线程
    private List<Action> actions = new List<Action>();  //
    public int[]tssd=new int [30];
    public bool bol = false;
      
    public static bool IsMainThread()
    {
        return Thread.CurrentThread == mainthread;
    }
    private void Awake()
    {
        Current = this;
        mainthread = Thread.CurrentThread;
        bol = true;
    }
    private void OnDestroy()
    {
        mainthread.Abort();
        bol = false;
    }
 void Start()
    {
        QueueOnThreadPool((Func_0), 0);
    }
void Update()
    {
        var currentActions = new List<Action>();
        lock (actions)
        {
            currentActions.AddRange(actions);
            foreach (var item in currentActions)
                actions.Remove(item);

            
        }
       

    }
  //主线程上的队列
    public static void QueueOnMainThread(Action action)
    {
        if (IsMainThread())
        {
            action();
            return;
        }

        lock (Current.actions)
        {
            Current.actions.Add(action);
        }
    }
    //线程池上的队列
    public static void QueueOnThreadPool(WaitCallback callBack, object state = null)
    {
        ThreadPool.QueueUserWorkItem(callBack, state);
    }

}





登录后复制
void Func_0(object parm)
    {
        try
        {
            while (bol)
            {
                tssd[0] += 1;
                Thread.Sleep(100);
            }
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
           
        }
    }
    
    

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空