下面是异步操作的相关资料,请问如何判断异步朗读结束?
使用 AsyncCallback 委托结束异步操作
在等待异步操作结果的同时可以进行其他工作的应用程序不应在操作完成之前阻止等待。 可以使用下列方法之一来在等待异步操作完成的同时继续执行指令。
-
可使用 AsyncCallback 委托来处理另一个线程中的异步操作的结果。 本主题中演示了此方法。
-
IsCompleted property of the IAsyncResult returned by the asynchronous operation's BeginOperationName method to determine whether the operation has completed." xml:space="preserve">可使用异步操作的 Begin操作名称 方法返回的 IAsyncResult 的 IsCompleted 属性来确定该操作是否已完成。 有关演示此方法的示例,请参见 轮询异步操作的状态。
'The following example demonstrates using asynchronous methods to'get Domain Name System information for the specified host computers.'This example uses a delegate to obtain the results of each asynchronous 'operation.Imports System
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Collections.Specialized
Imports System.Collections
Namespace Examples.AdvancedProgramming.AsynchronousOperations
Public Class UseDelegateForAsyncCallback
Dim Shared requestCounter
as Integer Dim Shared hostData
as ArrayList =
new ArrayList()
Dim Shared hostNames
as StringCollection =
new StringCollection()
Shared Sub UpdateUserInterface()
' Print a message to indicate that the application ' is still working on the remaining requests. Console.WriteLine(
"{0} requests remaining.", requestCounter)
End Sub Public Shared Sub Main()
' Create the delegate that will process the results of the ' asynchronous request. Dim callBack
as AsyncCallback
Dim host
as string Dim i, j, k
as Integer callback =
AddressOf ProcessDnsInformation
Do Console.Write(
" Enter the name of a host computer or <enter> to finish: ")
host = Console.ReadLine()
If host.Length > 0
' Increment the request counter in a thread safe manner. Interlocked.Increment(requestCounter)
' Start the asynchronous request for DNS information. Dns.BeginGetHostEntry(host, callBack, host)
End If Loop While (host.Length > 0)
' The user has entered all of the host names for lookup. ' Now wait until the threads complete. Do While requestCounter > 0
UpdateUserInterface()
Loop ' Display the results. For i = 0
To hostNames.
Count -1
Dim dataObject
as Object = hostData (i)
Dim message
as String ' Was a SocketException was thrown? If TypeOf dataObject
is String message =
CType(dataObject,
String)
Console.WriteLine(
"Request for {0} returned message: {1}", _
hostNames(i), message)
Else ' Get the results. Dim h
as IPHostEntry =
CType(dataObject, IPHostEntry)
Dim aliases()
as String = h.Aliases
Dim addresses()
as IPAddress = h.AddressList
If aliases.Length > 0
Console.WriteLine(
"Aliases for 0}", hostNames(i))
For j = 0
To aliases.Length -1
Console.WriteLine(
"{0}", aliases(j))
Next j
End If If addresses.Length > 0
Console.WriteLine(
"Addresses for {0}", hostNames(i))
For k = 0
To addresses.Length -1
Console.WriteLine(
"{0}",addresses(k).ToString())
Next k
End If End If Next i
End Sub ' The following method is called when each asynchronous operation completes. Shared Sub ProcessDnsInformation(result
as IAsyncResult)
Dim hostName
as String =
CType(result.AsyncState,
String)
hostNames.Add(hostName)
Try ' Get the results. Dim host
as IPHostEntry = Dns.EndGetHostEntry(result)
hostData.Add(host)
' Store the exception message. Catch e
as SocketException
hostData.Add(e.Message)
Finally ' Decrement the request counter in a thread-safe manner. Interlocked.Decrement(requestCounter)
End Try End Sub End ClassEnd Namespace