您好,欢迎访问三七文档
工业和信息化部“十二五”规划教材普通高等学校“十二五”规划教材《C#网络应用编程》第3版第5章异步编程2Ch5异步编程5.1并行和异步编程预备知识5.2异步编程基本技术5.1并行和异步编程预备知识5.1.1任务(Task类、TaskTResult类)5.1.2Lambda表达式5.1.3Action和Func委托5.1.4元组(Tuple类)45.1.1任务(Task类、TaskTResult类)1.Task类2.TaskTResult类3.Task.Delay方法Delay(Int32)//延时指定的毫秒数Delay(TimeSpan)//延时指定的时间(年、月、日、时、分、秒、毫秒等)Delay(Int32,CancellationToken)//延时指定的毫秒数后取消任务操作Delay(TimeSpan,CancellationToken)//延时指定的时间后取消任务操作5.1.2Lambda表达式1.基本用法定义(输入参数列表)={表达式或语句块}x=x*x(x,y)=x==y(intx,strings)=s.Lengthx()=SomeMethod()5.1.2Lambda表达式2.在LINQtoObjects中使用Lambda表达式Microsoft.NET框架ListintnumberList=newListint{5,4,1,3,9,8,6,7,2,0};varq1=numberList.Where(i=i4);ListintnumberList=newListint{5,4,1,3,9,8,6,7,2,0};varq2=fromiinnumberListwherei4selecti;5.1.2Lambda表达式3.示例5.1.3Action和Func委托1.一般形式Action[T1,T2,……,T16]Func[T1,T2,……,T16,]TResult5.1.3Action和Func委托2.基本用法classProgram{staticvoidMain(string[]args){Actionstringa=ShowMessage;a(OK);Console.ReadKey();}privatestaticvoidShowMessage(stringmessage){Console.WriteLine(message);}}5.1.3Action和Func委托3.示例5.1.4元组(Tuple类)元组是一种数据结构,其中的元素具有固定的数目和序列,在.NET框架中,可通过Tuple.Create方法直接创建具有1到7个元素的元组,另外,还可以通过嵌套的元组创建具有更多元素的对象。元组中的元素可通过Tuple对象的ItemN(N=1,2,3,……,7)属性得到。表示一组数据。提供对数据集的轻松访问和操作。在方法的参数传递中不使用out修饰符就可以返回多个值。用1个参数就可以将多个值传递给某个方法。5.2异步编程基本技术5.2.1异步编程的实现方式和异步操作关键字5.2.2创建任务5.2.3取消或终止任务的执行5.2.4获取任务执行的状态5.2.5报告任务执行的进度5.2.6定时执行某些任务5.2.1异步编程的实现方式和异步操作关键字1.异步编程的实现方式(1)传统的异步编程模型(APM)(2)基于事件的异步编程设计模式(EAP)(3)基于任务的异步模式(TAP)(4)改进的基于任务的异步模式(async、await、Task.Run和TAP)5.2.1异步编程的实现方式和异步操作关键字2.异步操作关键字(1)异步方法和异步事件处理程序(2)async修饰符如果方法没有返回值,则用async和Task共同签名。如果方法有返回值,则用async和Taskint共同签名。(3)await运算符(4)异步方法的命名约定5.2.2创建任务1.定义任务执行的方法(1)用普通方法定义任务(2)用异步方法定义任务(3)用匿名方法定义任务5.2.2创建任务2.利用Task.Run方法隐式创建和执行任务Run(FuncTask)//用默认调度程序在线程池中执行不带返回值的任务RunTResult(FuncTaskTResult)//用默认调度程序在线程池中执行带返回值的任务Run(FuncTask,CancellationToken)//执行任务过程中可侦听取消通知RunTResult(FuncTaskTResult,CancellationToken)//执行任务过程中可侦听取消通知5.2.2创建任务5.2.2创建任务3.利用async和await关键字隐式创建异步任务5.2.2创建任务4.利用WPF控件的调度器隐式创建和执行任务5.2.2创建任务5.通过显式调用Task或TaskTResult的构造函数创建任务(1)Task类的构造函数(2)TaskTResult类的构造函数5.2.3取消或终止任务的执行1.基本概念.NET框架引入的CancellationTokenSource类和CancellationToken结构用于协同实现多个线程、线程池工作项或Task对象的取消操作5.2.3取消或终止任务的执行2.CancellationTokenSource类和CancellationToken结构System.Threading.CancellationTokenSource用于创建取消通知,称为取消源。System.Threading.CancellationToken结构用于传播应取消操作的通知,称为取消令牌。执行任务的方法接收到取消通知后,可以用以下方式之一终止操作:(1)在任务代码中,简单地从委托中返回。(2)在任务代码中,引发OperationCanceledException异常,并将其传递到在其上请求了取消的标记。5.2.3取消或终止任务的执行3.基本用法5.2.4获取任务执行的状态1.冷任务和热状态用Task类或者TaskTResult类的构造函数显式创建的任务称为冷任务(coldtask),冷任务必须通过Start方法来启动。任务在生命周期内的执行情况称为热状态。5.2.4获取任务执行的状态2.Status属性和TaskStatus枚举利用任务实例的Status属性获取任务执行的状态。任务执行的状态用TaskStatus枚举表示。TaskStatus的枚举值有:Created:该任务已初始化,但尚未进入调度计划。WaitingForActivation:该任务已进入调度计划,正在等待被调度程序激活。WaitingToRun:该任务已被调度程序激活,但尚未开始执行。Running:该任务正在运行,但尚未完成。RanToCompletion:该任务已成功完成。Canceled:该任务由于被取消而完成(任务自身引发OperationCanceledException异常,或者在该任务执行之前调用方已向该任务的CancellationToken发出了信号)。Faulted:该任务因为出现未经处理的异常而完成。WaitingForChildrenToComplete:该任务本身已完成,正等待附加的子任务完成。3.任务完成情况相关的属性(1)IsCompleted属性(2)IsCanceled属性(3)IsFaulted属性(4)取消和完成之间的关系5.2.4获取任务执行的状态5.2.4获取任务执行的状态4.示例5.2.5报告任务执行的进度有时候我们可能希望让某些异步操作提供进度通知,以便在界面中显示异步操作执行的进度,这种情况下,可以用ProgressT类报告任务执行的进度。ProgressT类是通过IProgressT接口来实现的,该类的声明方式如下:publicclassProgressT:IProgressT{publicProgress();publicProgress(ActionThandler);protectedvirtualvoidOnReport(Tvalue);publiceventEventHandlerTProgressChanged;}5.2.5报告任务执行的进度5.2.6定时执行某些任务1.System.Timers.Timer类System.Timers.Timer类可与可视化设计器一同使用,该类可以引发事件,但它默认是在线程池线程中引发事件,而不是在当前线程中引发事件。System.Timers.Timer类的常用属性和方法如下:AutoReset属性:获取或设置一个布尔型的值,该值为true表示每次间隔结束时都引发一次Elapsed事件,false表示仅在首次间隔结束时引发一次该事件。Interval属性:获取或设置两次Elapsed事件的间隔时间(以毫秒为单位)。该值必须大于零并小于或等于Int32.MaxValue。默认值为100毫秒。Start方法:启动定时器。Stop方法:停止计时器。5.2.6定时执行某些任务2.System.Windows.Threading.DispatcherTimer类在客户端WPF应用程序中,对于需要与用户界面交互的任务,最简单的方式是使用System.Windows.Threading命名空间下的DispatcherTimer类来实现,这种定时器也是用时间模型来实现的,但它是在与当前线程关联的线程中定时执行任务,因此利用这种定时器可以直接获取或修改界面控件的属性。另外,该对象的定时效果没有System.Timers.Timer的定时精确,所以最好不要将其用于针对服务器的定时操作。5.2.6定时执行某些任务3.System.Threading.Timer类System.Threading.Timer类也是在线程池中定时执行任务,它与其他两种计时器的区别是该类不使用事件模型,而是直接通过调用TimerCallback类型的委托来实现。该类的构造函数语法为publicTimer(TimerCallbackcallback,//一个TimerCallback类型的委托,表示要执行的方法Objectstate,//一个包含回调方法要使用的信息的对象,可以为nullTimeSpandueTime,//首次调用回调方法之前延迟的时间量TimeSpanperiod//每次调用回调方法的时间间隔。-1表示禁用定期终止)利用该构造函数创建对象后,首次到达dueTime延时时间时会自动调用一次callback委托,以后每隔period时间间隔,都会自动调用一次callback委托。5.2.6定时执行某些任务4.用法示例第5章习题和上机练习本章习题:1、2、3、4、5、6本章上机练习:无。
本文标题:第05章-异步编程
链接地址:https://www.777doc.com/doc-2083924 .html