首页 > 代码库 > C#线程、任务总结(一)
C#线程、任务总结(一)
- 使用委托的轻型线程
- 异步委托
创建线程的一种简单的方式是定义一个委托,并异步调用它。委托是方法的类型安全的引用(类型安全代码指访问被授权可以访问的内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。类型安全的代码具备定义良好的数据类型)。Delegate 类还支持异步地调用方法,在后台,Delegate类会创建一个执行任务的线程。(PS: 委托使用线程池来完成异步任务。)定义好委托之后,可以有不同的技术异步调用委托,并返回结果。
- 投票
一种技术是投票,并检查委托是否完成了它的任务。所创建的Delegate 类提供了BeginInvoke( ) 方法,在该方法中,可以传递用委托类型定义的输入参数。BeginInvoke( )方法总是有AsyncCallback 和 object 类型的两个额外参数。示例代码如下:
运行结果如下所示:
.TakeAWhile started!
..........................................TakesAWhile completed
result: 2
?
除了检查委托是否完成之外,还可以在完成了由主线程执行的工作后,调用委托类型的EndInvoke( ) 方法。EndInvoke( ) 方法会一直等待,直到委托完成其任务位置。但是如果委托结束之前不等待委托完成其任务就结束主线程的话,委托就会终止。示例如下:
????????运行结果如下:
Main Thread Sleep 1000 ms
TakeAWhile started!
Main Thread Waiting for delegate to complete
TakesAWhile completed
result: 2
- 等待句柄
等待一部委托的结果的另一种方式是适用与IAayncResult 相关联的等待句柄。使用AsyncWaitHandle 属性可以访问等待句柄。这个属性返回一个WaitHandle 类型的对象,它可以等待委托线程完成其任务。WaitOne( )将超时时间作为第一个可选参数。示例代码如下所示:
????????结果如下所示:
TakeAWhile started!
TakesAWhile completed
Can get result now
result: 2
Main thread exit
????可以看到,主线程等待了2100ms,所以可以看到异步委托后的结果,如果把主线程的等待时间设为小于2000ms的话,可能就看不到异步委托的结果了。当然这都是不一定的,关键看操作系统是如何调度的。
?
- 异步回调
等待委托结果的第三种方式是使用异步回调。在BenginInvoke( )方法的第3个参数中,可以传递一个满足AsyncCallback 委托的需求的方法。对于最后一个参数,可以传递任意的对象,以便从回调方法中访问它。传递委托实例很有用,这样回调方法就可以使用它获得异步方法的结果。例子如下,行结果同上。
C#线程、任务总结(一)