首页 > 代码库 > C#线程、任务总结(一)

C#线程、任务总结(一)

  1. 使用委托的轻型线程
  1. 异步委托

创建线程的一种简单的方式是定义一个委托,并异步调用它。委托是方法的类型安全的引用(类型安全代码指访问被授权可以访问的内存位置。例如,类型安全代码不能从其他对象的私有字段读取值。它只从定义完善的允许方式访问类型才能读取。类型安全的代码具备定义良好的数据类型)。Delegate 类还支持异步地调用方法,在后台,Delegate类会创建一个执行任务的线程。(PS: 委托使用线程池来完成异步任务。)定义好委托之后,可以有不同的技术异步调用委托,并返回结果。

  1. 投票

一种技术是投票,并检查委托是否完成了它的任务。所创建的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

  1. 等待句柄

    等待一部委托的结果的另一种方式是适用与IAayncResult 相关联的等待句柄。使用AsyncWaitHandle 属性可以访问等待句柄。这个属性返回一个WaitHandle 类型的对象,它可以等待委托线程完成其任务。WaitOne( )将超时时间作为第一个可选参数。示例代码如下所示:

????????结果如下所示:

TakeAWhile started!

TakesAWhile completed

Can get result now

result: 2

Main thread exit

????可以看到,主线程等待了2100ms,所以可以看到异步委托后的结果,如果把主线程的等待时间设为小于2000ms的话,可能就看不到异步委托的结果了。当然这都是不一定的,关键看操作系统是如何调度的。

?

  1. 异步回调

    等待委托结果的第三种方式是使用异步回调。在BenginInvoke( )方法的第3个参数中,可以传递一个满足AsyncCallback 委托的需求的方法。对于最后一个参数,可以传递任意的对象,以便从回调方法中访问它。传递委托实例很有用,这样回调方法就可以使用它获得异步方法的结果。例子如下,行结果同上。

C#线程、任务总结(一)