在向大家详细介绍VB.NET线程之前,首先让大家了解下线程,然后全面介绍VB.NET线程方法。线程是操作系统分配处理器时间的基本单元,线程可以在单个执行线程执行的同时运行多个活动,支持抢先多任务处理的操作系统可以创建多个线程并通过时间片轮转的方式使它们同时运行。在需要良好用户交互的应用以及与网络和数据库进行通讯的应用中,使用多线程能提供良好的交互体验,能对用户的要求做出快速的反应。本文主要介绍.NET中的线程在数据库编程中的具体应用(用VB.NET实现)。
1 创建数据库访问线程
在数据库应用中,特别是网络数据库访问,因为可能要访问的数据量较大,因此需要比较长的时间来得到结果,而一个良好的程序应具有良好的交互性,在访问数据库时应允许你的应用程序对用户的活动尽快做出响应,以提供丰富的用户体验。利用多线程机制可以让需要大量时间的操作在后台运行以快速响应用户的活动。下面的代码访问数据库并返回数据表:
Private sub GetDataFromDataBase()
…
m_table.Clear() m_sqlDataAdapter.Fill(m_table)
…
End Sub
创建Thread对象的新实例,需创建新的线程代理.ThreadStart线程代理可以指定生成线程时要执行的方法名,但线程代理并不实际运行线程.创建ThreadStart对象时,需指定线程开始执行时要运行的方法的指针,该方法不能接受任何参数。下面我们将上面的代码分配给一个线程处理,并且启动它:
Dim myThreadStart as ThreadStart =New ThreadStart(AddressOf GetDataFromDataBase)
Dim myThread as Thread=New Thread(myThreadStart)
myThread.Start()
这样当进行数据库的访问时,用户可以继续进行处理。
2.VB.NET线程方法使用事件
调用了线程的start方法,并不能确保其中的方法马上执行完,而要得到数据访问的结果又必须等其中的方法执行完毕。如果在运行线程后采用循环查询的方法显然影响了交互性,事件是从线程方法返回数据的好方法。只要在VB.NET线程方法所在的类中定义一个事件,在VB.NET线程方法中发出事件,而在窗体类中生成代理。
首先在dealDataBase类声明后加进事件:
Public Class dealDataBase
Public Event GetDataComplete(ByVal e As DtatTable)
…
End Class
在类dealDataBase的GetDataFromDataBase()方法中加入发出事件的代码,放在m_sqlDataAdapter.Fill(m_table)后:
Public sub GetDataFromDataBase()
…
m_sqlDataAdapter.Fill(m_table) RasiseEvent GetDataComplete(m_table)
…
End Sub
下面在窗体类中生成代理
Private Sub dealData (ByVal e As DataTable)
'处理数据表
End Sub
在创建线程并运行线程的代码中进行事件连接,事件连接代码放在运行线程前, dealDataBase类实例化后:
AddHandler myDB. GetDataComplete,AddressOf dealData
这样,当线程方法执行完毕就会发出事件,而dealData方法会响应事件并做出处理。