Unity使用C#的多线程

在unity里边使用多线程做一些事情是非常好的,比如解压资源 更新资源等。因为单开线程的话 不会影响主线程卡顿,这样UI就不会卡了。但是开的线程里边不能执行unity主线程的mono代码。线程启动后,执行完毕自动结束该线程、可以同时启动多个线程做事。

代码如下: 

using System.Threading;

void StartThread()

    {

        Thread athread = new Thread(new ThreadStart(goThread));

 athread.IsBackground = true;//防止后台现成。相反需要后台线程就设为false

        athread.Start();
    }
 void Awake()
    {
        StartThread();
    }
 object lockd = new object();
    void goThread()
    {
        int index = 0;
        while (true)
        {
            lock (lockd)//防止其他线程访问当前线程使用的数据
            {
                Debug.Log("in thread" + index);
                index++;
                if (index == 100)
                {
                    Thread.Sleep(10000);//   将当前线程挂起指定的时间 毫秒  时间结束后 继续执行下一步  和yield类似
                }
                else if (index == 200)
                {
                    break;//该函数执行完自动结束该线程
                }
            }
        }
    }


所以其实多线程和协程原理差别很大的,只是功能有点类似。


1、当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的。

2、当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。

3、只有IsBackground=TRUE的线程才会随着主线程的退出而退出

---------------------------------------------------------------------------------------------

ThreadStart:

Thread athread = new Thread(new ThreadStart(goThread));

        athread.Start();//该方法启动的多线程 不能带有参数。

ParameterThreadStart:

ParameterThreadStart的定义为void ParameterizedThreadStart(object state),使用这个这个委托定义的线程的启动函数可以接受一个输入参数,具体例子如下 :

[csharp]  view plain  copy
  1. <pre name="code" class="cpp">ParameterizedThreadStart threadStart=new ParameterizedThreadStart(Calculate)  
  2. Thread thread=new Thread(threadStart)   
  3. thread.Start(0.9);//参数是0.9  
  4. public void Calculate(object arg)//arg参数是0.9  
  5. {  
  6. double Diameter=double(arg);  
  7. Console.Write("The Area Of Circle with a Diameter of {0} is {1}"Diameter,Diameter*Math.PI);  
  8. }  


 
Calculate方法只有一个为object类型的参数。需要传多个参数的时候 需要把参数都塞进object 然后进行转换。比如: 

一个参数 void BuildA(object para){  List<int> list=para as List<int>;...}  

BuildA(list);

多个参数 void BuildB(object para){  object[] ps= para as object[];List<int> list=ps[0] as as List<int>;GameObject b=ps[1] as GameObject;...} 

 BuildB(new object[]{list,obj});//把多个参数塞到object数组里边 传过去,相当于只传一个参数。


至于是开一个线程还是多个线程 根据需求和内核数SystemInfo.processorCount来确定。最好一个核开一个线程  会快点。

详见bundleglobal.cs和sdFileSystem.cs/sdMultiThread.cs

读写多线程最好的方式是开多个线程去读  保存到临时地方  然后开一个线程去保存,不然如果多个线程同时读和写 肯定会冲突的。


一篇关于C#线程讲解的好文章:http://www.albahari.com/threading/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值