C# 线程,异步,协程

来源:互联网 发布:天涯 知乎 豆瓣 贴吧 编辑:程序博客网 时间:2024/06/10 05:39

一 线程


二 异步

1 为什么要用异步

简单说异步就是并行执行两件事,比同步执行快

函数a执行3秒,函数b执行5秒,如果按顺序执行需要8秒(同步)

使用异步的话,可以用异步先调用函数b,然后正常调用函数a,这时b还没执行完,a已经开始执行了,所以总时间应该会<=8秒


2什么时候用异步,什么时候用线程

http://blog.csdn.net/onafioo/article/details/44342775


3 怎么用异步

首先委托其实不单是个函数指针,实际是个类,类中有几个方法可用来实现异步BeginInvok,EndInvok等

http://blog.csdn.net/onafioo/article/details/44354219

public delegate void TestDele(int num);public void showNum(int num){for(int i=0;i<10000000;i++){}Debug.Log(string.Format("num:{0}",num));}void main(){TestDele testDele = new TestDele(showNum);//这里定义委托时,内部自动生成BeginInvok,EndInvok等,这些方法用来实现异步testDele.BeginInvok(100);Debug.Log("start");testDele.EndInvok();//这里必须结束,因为异步实际是从线程池中取了一个空闲线程,用完得归还Debug.Log("over");}

1 执行testDele.BeginInvok

2 不用等待showNum结束马上执行Debug.Log("start")

3 等待showNum结束执行testDele.EndInvok();//没结束就阻塞

4 最后执行Debug.Log("over");


4 c#中的AsyncCallback(异步委托)是做什么用的

首先c#异步函数是启动(BeginInvok)了一个线程池中的线程,所以要在函数结束后归还给线程池(EndInvok)

所以问题来了怎么判断函数结束呢

有4种方法http://blog.csdn.net/onafioo/article/details/44354219

而AsyncCallback就是用来在异步函数结束后,使用回调的方法执行EndInvok

用回调的好处

1 不会形成阻塞

2 不用自己循环等待函数结束再EndInvok,等函数结束后自动通过AsyncCallback调用  处理后事的函数执行EndInvok

public delegate void TestDele(int num);public void showNum(int num){for(int i=0;i<10000000;i++){}Debug.Log(string.Format("num:{0}",num));}public void callBack(IAsyncResult ar)//用来处理后事(EndInvok)的函数,参数必须写IAsyncResult类型{TestDele  dele =  (TestDele) ar.AsyncState;dele.EndInvok();//这里也可以写点其他有用的东西..}void main(){TestDele testDele = new TestDele(showNum);//这里定义委托时,内部自动生成BeginInvok,EndInvok等,这些方法用来实现异步testDele.BeginInvok(100,new AsynvCallback(callBack),testDele);Debug.Log("start");}



三 协程

0 0
原创粉丝点击