📄 async.vb
字号:
End With
If blnMultiServer Then
cnnOrders = New SqlConnection(Replace(strOrders, ";Async=True", ""))
Else
cnnOrders = New SqlConnection(Replace(strCusts, ";Async=True", ""))
End If
Dim cmdOrders As SqlCommand = cnnOrders.CreateCommand
With cmdOrders
.CommandType = CommandType.Text
.CommandTimeout = 10
.CommandText = "SELECT * FROM Orders"
End With
If blnMultiServer Then
cnnDetails = New SqlConnection(Replace(strDetails, ";Async=True", ""))
Else
cnnDetails = New SqlConnection(Replace(strCusts, ";Async=True", ""))
End If
Dim cmdDetails As SqlCommand = cnnDetails.CreateCommand
With cmdDetails
.CommandType = CommandType.Text
.CommandTimeout = 10 'milliseconds
.CommandText = "SELECT * FROM [Order Details]"
End With
lstOps.Items.Clear()
timHiRes.Start()
'Open the Customers connection and execute reader
cnnCusts.Open()
lstOps.Items.Add(Format(timHiRes.ElapsedTime, "0.000") + " - 1 Opened Customers connection/reader")
Dim sdrCusts As SqlDataReader = cmdCusts.ExecuteReader(CommandBehavior.CloseConnection)
With sdrCusts
Dim intCtr As Integer
Dim objValue As Object
While .Read
For intCtr = 0 To .FieldCount - 1
objValue = .GetValue(intCtr)
Next intCtr
End While
.Close()
End With
'Open the Orders connection and execute reader
cnnOrders.Open()
lstOps.Items.Add(Format(timHiRes.ElapsedTime, "0.000") + " - 2 Opened Orders connection/reader")
Dim sdrOrders As SqlDataReader = cmdOrders.ExecuteReader(CommandBehavior.CloseConnection)
With sdrOrders
Dim intCtr As Integer
Dim intLoop As Integer
Dim objValue As Object
While .Read
For intLoop = 1 To intLoops
For intCtr = 0 To .FieldCount - 1
objValue = .GetValue(intCtr)
Next intCtr
Next intLoop
End While
.Close()
End With
'Open the Details connection and execute reader
cnnDetails.Open()
lstOps.Items.Add(Format(timHiRes.ElapsedTime, "0.000") + " - 3 Opened Details connection/reader")
Dim sdrDetails As SqlDataReader = cmdDetails.ExecuteReader(CommandBehavior.CloseConnection)
With sdrDetails
Dim intCtr As Integer
Dim objValue As Object
While .Read
For intCtr = 0 To .FieldCount - 1
objValue = .GetValue(intCtr)
Next intCtr
End While
.Close()
End With
lstOps.Items.Add(Format(timHiRes.ElapsedTime, "0.000") + " - 4 End reading Order Details")
Catch excSync As Exception
Me.Cursor = Cursors.Default
MsgBox(excSync.Message + excSync.StackTrace, , "Async Operation Exception")
Finally
Me.Cursor = Cursors.Default
btnExecSync.Enabled = True
End Try
End Sub
'****************************************
'Optional Sub Main to demonstrate WaitAll
'Wait all requires a multi-threaded apartment (MTA) class
'Win32 forms are single-threaded apartment (STA) classes
'The default for VB.NET classes is STA so you must add the
'<MTAThreadAttribute> to Shared Sub Main
'Mark the Startup with custom Sub Main checkbox on the
'Application page of the project's Properties window
'and press Ctrl+S to save the changes to run the WaitAll demo
'****************************************
<MTAThreadAttribute()> _
Shared Sub Main()
'Set true for multi-server operation
Dim blnIsMultiServer As Boolean
Try
cnnCusts = New SqlConnection(strCusts)
Dim cmdCusts As SqlCommand = cnnCusts.CreateCommand
With cmdCusts
.CommandType = CommandType.Text
.CommandTimeout = 10
.CommandText = "SELECT * FROM Customers"
End With
If blnIsMultiServer Then
cnnOrders = New SqlConnection(strOrders)
Else
cnnOrders = New SqlConnection(strCusts)
End If
Dim cmdOrders As SqlCommand = cnnOrders.CreateCommand
With cmdOrders
.CommandType = CommandType.Text
.CommandTimeout = 10
.CommandText = "SELECT * FROM Orders"
End With
If blnIsMultiServer Then
cnnDetails = New SqlConnection(strDetails)
Else
cnnDetails = New SqlConnection(strCusts)
End If
Dim cmdDetails As SqlCommand = cnnDetails.CreateCommand
With cmdDetails
.CommandType = CommandType.Text
.CommandTimeout = 10
.CommandText = "SELECT * FROM [Order Details]"
End With
Dim timHiRes As New clsTimer
timHiRes.Start()
Dim awhHandle(2) As WaitHandle
'Open the Customers connection
cnnCusts.Open()
astrListItems(0) = Format(timHiRes.ElapsedTime, "0.000") + " - 1 Opened Customers connection"
Dim asrCustomersReader As IAsyncResult
asrCustomersReader = cmdCusts.BeginExecuteReader(CommandBehavior.CloseConnection)
awhHandle(0) = asrCustomersReader.AsyncWaitHandle
astrListItems(1) = Format(timHiRes.ElapsedTime, "0.000") + " - 2 BeginExecuteReader: Customers"
'Open the Orders connection
cnnOrders.Open()
astrListItems(2) = Format(timHiRes.ElapsedTime, "0.000") + " - 3 Opened Orders connection"
Dim asrOrdersReader As IAsyncResult
asrOrdersReader = cmdOrders.BeginExecuteReader(CommandBehavior.CloseConnection)
awhHandle(1) = asrOrdersReader.AsyncWaitHandle
astrListItems(3) = Format(timHiRes.ElapsedTime, "0.000") + " - 4 BeginExecuteReader: Orders"
'Open the Details connection
cnnDetails.Open()
astrListItems(4) = Format(timHiRes.ElapsedTime, "0.000") + " - 5 Opened Details connection"
Dim asrDetailsReader As IAsyncResult
asrDetailsReader = cmdDetails.BeginExecuteReader(CommandBehavior.CloseConnection)
awhHandle(2) = asrDetailsReader.AsyncWaitHandle
astrListItems(5) = Format(timHiRes.ElapsedTime, "0.000") + " - 6 BeginExecuteReader: Order Details"
WaitHandle.WaitAll(awhHandle)
Dim sdrCustomers As SqlDataReader = cmdCusts.EndExecuteReader(asrCustomersReader)
'Do something with the data
sdrCustomers.Close()
sdrCustomers.Dispose()
Dim sdrOrders As SqlDataReader = cmdOrders.EndExecuteReader(asrOrdersReader)
'Do something with the data
sdrOrders.Close()
sdrOrders.Dispose()
Dim sdrDetails As SqlDataReader = cmdDetails.EndExecuteReader(asrDetailsReader)
'Do something with the data
sdrDetails.Close()
sdrDetails.Dispose()
astrListItems(6) = Format(timHiRes.ElapsedTime, "0.000") + " - 7 EndExecuteReader: All readers"
frmAsync.ShowDialog()
Catch excAsync As Exception
MsgBox(excAsync.Message + excAsync.StackTrace, , "Async Operation Exception")
End Try
End Sub
Private Sub frmAsync_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
'If Sub Main has run, load the list box
If Not astrListItems(0) Is Nothing Then
Dim intCtr As Integer
For intCtr = 0 To 6
lstOps.Items.Add(astrListItems(intCtr))
Next
End If
End Sub
'*************************************************************************
'Code examples in Chapter 2's "Execute SqlCommands Asynchronously" section
'*************************************************************************
Private Sub PollingAsyncCommand()
'Execute commands asynchronously with polling
'Example code; not part of project
Try
Dim strConn As String = "Data Source=localhost;" + _
"Initial Catalog=Northwind;Integrated Security=SSPI;Async=True"
Dim cnnCusts As SqlConnection = New SqlConnection(strConn)
cnnCusts = New SqlConnection(strCusts)
Dim cmdCusts As SqlCommand = cnnCusts.CreateCommand
With cmdCusts
.CommandType = CommandType.Text
.CommandTimeout = 60
.CommandText = "SELECT * FROM Customers"
End With
Dim asrCustsReader As IAsyncResult = _
cmdCusts.BeginExecuteReader(CommandBehavior.CloseConnection)
While Not asrCustsReader.IsCompleted
'Do something while waiting
End While
Dim sdrCusts As SqlDataReader = cmdCusts.EndExecuteReader(asrCustsReader)
'Do something with the data
sdrCusts.Close()
sdrCusts.Dispose()
Catch excAsync As Exception
MsgBox(excAsync.Message + excAsync.StackTrace, , "Async Operation Exception")
End Try
End Sub
Private Sub CallbackAsyncCommand()
'Execute commands asynchronously with a callback
'Example code; not part of project
Try
Dim strConn As String = "Data Source=localhost;" + _
"Initial Catalog=Northwind;Integrated Security=SSPI;Async=True"
Dim cnnCusts As SqlConnection = New SqlConnection(strConn)
cnnCusts = New SqlConnection(strCusts)
Dim cmdCusts As SqlCommand = cnnCusts.CreateCommand
With cmdCusts
.CommandType = CommandType.Text
.CommandTimeout = 60
.CommandText = "SELECT * FROM Customers"
End With
cnnCusts.Open()
'Provide the SqlCommand as the stateObject
Dim objCmdCusts As Object = CType(cmdCusts, Object)
Dim asrCustsReader As IAsyncResult = _
cmdCusts.BeginExecuteReader(New AsyncCallback(AddressOf CustomersHandler), objCmdCusts, CommandBehavior.CloseConnection)
Catch excAsync As Exception
MsgBox(excAsync.Message + excAsync.StackTrace, , "Async Operation Exception")
End Try
End Sub
End Class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -