第14章 线程和异步编程(5)

2019-04-23 14:38

第14章 线程和异步编程

14.5.NET中的异步编程

教学提示 : 本节主要达到目的。

? 了解异步编程设计模式的一些技术点。(略讲) ? 了解异步文件流读取的相关技术。(略讲) ? 了解异步委托的相关技术。(略讲) 教学内容 讲授: 首先我们了解一下.NET Framework对异步编程有哪些支持: 讲解课本:14.5.1 讲授: 现在我们来了解一下异步编程的设计模式的相关知识,这里我们主要是要讲解IAsyncResult接口的技术: 讲解课本:14.5.2 演示: 课堂演示代码运行结果。 讲解课本14.5.3 教学方法 阅书:14.5.1 幻灯:第28-29页 阅书:14.5.2 幻灯:第30页 课堂演示 幻灯:第31-32页 讲授: 阅书:14.5.4 提示 除了系统提供的类,比如流、网络通信、幻灯:第33页 MSMQ等具有异步接口的类之外,系统还 为不具备异步调用能力的对象提供了通用的异步调用功能。可以通过委托的方式使用这种功能。 假设原来编写了一个类,类里有一个方法,比如处理某一操作的process方法,如果开发人员在实现该类时,不知道如何在内部实

21

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

现异步调用的功能,事实上,一般的业务开发者也没有能力去实现这样的功能,那么可以通过委托,让委托指向process方法,委托再提供一个和process方法相同的process同步调用时,还会提供一对BeginInvoke和EndInvoke方法,也就是说,为某个对象创建委托,指向这个对象的方法后,该委托会同时具有同步调用和异步调用的能力,因此,可以利用委托里的BeginInvoke和EndInvoke来调用本来只具有同步功能的方法,让它变成异步方法。这样就能方便地为自己编写的类提供异步调用方法,只需要用委托对象指向类中的方法,此时该方法就能通过委托获得BeginInvoke和EndInvoke,使用方法和前面介绍的一样,先在主线程或调用线程中调用BeginInvoke,得到IasyncResult接口,然后用不同的方法,例如回调、轮询或EndInvoke等来获取异步调用的结果。 讲解课本:14.5.4 总结

经过本章的学习,我们了解了下列的知识和内容。

? 掌握创建和管理线程的方法,并能创建线程的安全代码,同时还能掌握使用线程池创

建线程的方法。

? 掌握创建和使用计时器的方法。 ? 掌握使用委托进行异步调用的方法。。

在第十五章中,我们将学习使用托管代码与非托管代码之间的互操作方法和步骤。

随堂练习:

1. SomeClass.BusyRun 是类SomeClass 的一个静态方法,它运行一次需要2 个小时,它

的作用是在屏幕的随机位置画一个圆。使用以下代码创建一个新的托管线程t1: Dim t1 As Thread = New _

Thread(New ThreadStart(AddressOf SomeClass.ThreadRun))

22

第14章 线程和异步编程

其中。若随后连续调2 次以下语句: t1.Start()

其结果为(假设Start 语句调用后线程可马上开始): A. 第二次调用后,有两个线程在运行

B. 第二次调用后,有一个线程在运行,并激发一个异常 C. 第二次调用后,没有任何线程运行 正确答案:B

2. 为了处理不同情形的多线程同步,.NET Framework 在System.Threading 命名空间中

提供了下列哪些WaitHandle 类的派生类(多选)? A. AutoResetEvent B. ManualResetEvent C. Monitor D. Mutex

正确答案:ABC

3. 类SomeClass 定义如下:

Class SomeClass

Public Shared I As Integer Public j As Integer Public Sub Increment() j += 1 End Sub

Private Sub Clear() j = 0 End Sub End Class

为了防止多个线程同时对字段j 的值进行增加, 则应将属性

添加到: A. SomeClass 类 B. j 字段

23

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

C. Increament 方法 D. Clear 方法 正确答案:C

4. 多线程VB.NET 程序中,类SomeClass 定义如下:

Class SomeClass

Dim rwl As New ReaderWriterLock Private i As Integer Public Sub Read()

rwl.AcquireReaderLock(Timeout.Infinite) Interlocked.Increment(i) Thread.Sleep(1000) rwl.ReleaseReaderLock() End Sub

Public Sub Write()

rwl.AcquireWriterLock(Timeout.Infinite) Interlocked.Decrement(i) Thread.Sleep(1000) rwl.ReleaseWriterLock() End Sub End Class

已知此刻线程Thread1 正在执行Write (),则此时可有多少线程同时调用 Read ()并将i 的值加1? A. 0 个 B. 1 个 C. 多个 正确答案:A

5. 若需要对文件“readme.txt”启动使用轮询的异步读取,则在调用以下语句后,应继

续调用的方法是__________. Dim buffer[1024] As Byte

Dim aStream As Stream = File.OpenRead(“readme.txt”)

24

第14章 线程和异步编程

A. Dim byteRead As Integer = aStream.Read(buffer,0,buffer.length) B. Dim byteRead As Integer = aStream.BeginRead(buffer,0,buffer.length) C. Dim ar As IAsynResult _= aStream.Read(buffer,0,buffer.length,Nothing,

Nothing)

D. D. IAsynResult ar _= aStream.BeginRead(buffer,0,buffer.length, Nothing, Nothing) 正确答案:D

6. 假设t1和t2是托管进程中仅有的两个线程,经过以下的程序运行后,t2的状态是:

??

t2.IsBackground = True t1.Start() t2.Start() t2.Interrupt() t1.Abort() ??

A. Running B. Stopped C. Suspended D. Unstarted 正确答案:B

7. 当两个线程同时或几乎访问同一用

修饰的代码域时,两个线程的状态是: A. Running Running B. Running Stopped C. Running Suspended D. Running Unstarted E. Suspended Suspended 正确答案:C

8. 在控件上,对于从线程调用是安全的方法: A. Interlocked B. CreateGraphics

25

《基于VB.NET的.NET Framework程序设计》教学指导手册—详细教案

C. AcquireWriterLockInterlocked D. AcquireReaderLock 正确答案:B

布置作业

1. 完成书后习题1-习题10

2. 预习本章中的要求的实验,在实验课上准备操作。

实验注意事项:

P 271

实现StartLogger方法 ?应该是 实现StopLogger方法

P 273 1) 在Form1.cs中,定位到MyLogger类的StopLogger方法中的下列注释

应该是 StartLogger

P 274

1) form1.cs中,定位到MyLogger类的StopLogger方法中的下列注释 应该是 StartLogger

26


第14章 线程和异步编程(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:汽车销售管理系统报告 - 图文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: