📄 ch9_demoform003.vb
字号:
Option Strict On
Imports System.Data.SqlClient
Imports System.Threading
Public Class CH9_DemoForm003
Private Sub btnWaitAsynch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWaitAsynch.Click
Me.btnWaitAsynch.Enabled = False
' 利用 SqlConnectionStringBuilder 对象来构建连接字符串。
Dim connectStringBuilder As New SqlConnectionStringBuilder()
connectStringBuilder.DataSource = "(local)\SQLExpress"
connectStringBuilder.InitialCatalog = "北风贸易"
connectStringBuilder.IntegratedSecurity = True
' 启用异步处理。
connectStringBuilder.AsynchronousProcessing = True
' 建立两个不同的 StoWatch 对象。
Dim myWatch As New Stopwatch()
Dim mySecondWatch As New Stopwatch()
' 建立两个不同的连接。
Dim myConnection1 As SqlConnection = New SqlConnection(connectStringBuilder.ConnectionString)
Dim myConnection2 As SqlConnection = New SqlConnection(connectStringBuilder.ConnectionString)
' 建立两个不同的查询字符串。
Dim myQuery1 As String = "WAITFOR DELAY '0:0:01';" & _
"SELECT 产品相片编号, 相片缩图, 相片全图 FROM 自行车产品相片"
Dim myQuery2 As String = "WAITFOR DELAY '0:0:03';" & _
"SELECT 员工号码, 姓名, 玉照 FROM 章立民研究室"
Try
' 启动两个定时器。
myWatch.Start()
mySecondWatch.Start()
' 我们要替每一个查询开启一个连接并开始执行。
' 使用每一个 BeginExecuteReader 所返回的 IAsyncResult 对象,
' 我们可以分别将其 WaitHandle 新增至数组中。
myConnection1.Open()
Dim myCommand1 As SqlCommand = New SqlCommand(myQuery1, myConnection1)
Dim myResult1 As IAsyncResult = myCommand1.BeginExecuteReader()
Dim myWaitHandle1 As WaitHandle = myResult1.AsyncWaitHandle
myConnection2.Open()
Dim myCommand2 As SqlCommand = New SqlCommand(myQuery2, myConnection2)
Dim myResult2 As IAsyncResult = myCommand2.BeginExecuteReader()
Dim myWaitHandle2 As WaitHandle = myResult2.AsyncWaitHandle
' 将等候控制代码新增至 WaitHandle 数组中,如此一来,我们
' 可以在它们进入时检查所有的等候控制代码。
Dim myWaitHandles As WaitHandle() = {myWaitHandle1, myWaitHandle2}
Dim index As Integer
Dim countWaits As Integer
For countWaits = 0 To 2
' 现在我们要等候指定数组中有任何元素收到信号,亦即检视是否有
' 任何等候控制代码完成。
index = WaitHandle.WaitAny(myWaitHandles, 5000, False)
' 根据所传回的处理,我们会将其数据显示在 DataGridView 控件中。
' 您可以在此处进行额外的处理。由于这是以异步方式发生,因此
' 我们并不知道何者会先完成。
Select Case index
Case 0
Using myReader1 As SqlDataReader = myCommand1.EndExecuteReader(myResult1)
' 将查询结果显示在第一个 DataGridView 控件中。
If myReader1.Read() Then
myWatch.Stop()
elapsedTime.Text = "第一个返回的查询结果:" & _
myWatch.ElapsedMilliseconds.ToString() & " ms"
Dim myTable As DataTable = New DataTable
myTable.Load(myReader1)
DataGridView1.DataSource = myTable
End If
End Using
Exit Select
Case 1
Using myReader2 As SqlDataReader = myCommand2.EndExecuteReader(myResult2)
' 将查询结果显示在第二个 DataGridView 控件中。
If myReader2.Read() Then
mySecondWatch.Stop()
elapsedTime2.Text = "第二个返回的查询结果:" & _
mySecondWatch.ElapsedMilliseconds.ToString() & " ms"
Dim myTable As DataTable = New DataTable()
myTable.Load(myReader2)
DataGridView2.DataSource = myTable
End If
End Using
Exit Select
Case WaitHandle.WaitTimeout
Exit Select
End Select
Next
Catch ex As Exception
MessageBox.Show("使用 WaitHandles 返回数据时发生错误,请再次尝试。", "请注意")
End Try
myConnection1.Close()
myConnection2.Close()
messageReturned.Text = "数据已经使用 WaitHandles 返回!"
Me.btnWaitAsynch.Enabled = True
End Sub
Private Sub testResultsGroupBox_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles testResultsGroupBox.Enter
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -