以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  如何判断异步朗读结束  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=39805)

--  作者:明丰
--  发布时间:2013/9/2 11:08:00
--  如何判断异步朗读结束

下面是异步操作的相关资料,请问如何判断异步朗读结束

 

使用 AsyncCallback 委托结束异步操作

在等待异步操作结果的同时可以进行其他工作的应用程序不应在操作完成之前阻止等待。 可以使用下列方法之一来在等待异步操作完成的同时继续执行指令。

  • AsyncCallback delegate to process the results of the asynchronous operation in a separate thread.\' xml:space="preserve">可使用 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操作名称 方法返回的 IAsyncResultIsCompleted 属性来确定该操作是否已完成。 Polling for the Status of an Asynchronous Operation.\' xml:space="preserve">有关演示此方法的示例,请参见 轮询异步操作的状态

Dns class to retrieve Domain Name System (DNS) information for user-specified computers.\' xml:space="preserve">下面的代码示例演示如何使用 Dns 类中的异步方法来检索用户指定的计算机的域名系统 (DNS) 信息。 AsyncCallback delegate that references the ProcessDnsInformation method.\' xml:space="preserve">此示例创建一个引用 ProcessDnsInformation 方法的 AsyncCallback 委托。 对各个针对 DNS 信息发出的异步请求,将分别调用一次此方法。

BeginGetHostByNameObject parameter.\' xml:space="preserve">请注意,用户指定的主机被传递给了 BeginGetHostByNameObject 参数。 Using an AsyncCallback Delegate and State Object.\' xml:space="preserve">有关演示如何定义和使用更复杂的状态对象的示例,请参见 使用 AsyncCallback 委托和状态对象

Using an AsyncCallback Delegate and State Object.\' xml:space="preserve"> 

Using an AsyncCallback Delegate and State Object.\' xml:space="preserve">vb代码:

Using an AsyncCallback Delegate and State Object.\' xml:space="preserve"> 

\'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 Class
End Namespace

 


--  作者:Bin
--  发布时间:2013/9/2 11:29:00
--  
呵呵,这个你想在狐表里实现. 很麻烦的.  你还是放弃吧. 基本上无法实现的了.
--  作者:程兴刚
--  发布时间:2013/9/2 12:43:00
--  

直接在异步朗读代码后面跟上朗读结束的提示或设置全局变量值,判断变量不就可以了,比如:

Dim sp As New DotNetSpeech.SpVoice()
sp.Speak(
"I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync)

MessageBox.show("朗读结束")

 

或者增加一个名称为"朗读标识"的字符型全局变量,代码为:

 

Vars("朗读标识") = "朗读中……"

Dim sp As New DotNetSpeech.SpVoice()
sp.Speak(
"I am from china.", DotNetSpeech.SpeechVoiceSpeakFlags.SVSFlagsAsync)

Vars("朗读标识") = "朗读结束"

 

需要判断的时候,判断这个全局变量的值即可。


--  作者:明丰
--  发布时间:2013/9/2 22:37:00
--  
异步朗读不是优先级,其他代码会优先执行,必须通过线程判断。
--  作者:有点甜
--  发布时间:2013/9/2 22:45:00
--  
 楼主,你同步读取吧,你新开一个线程,然后这个线程同步读取,结束的话,做个标识。

 新开线程也很简单。

 dim nthread as New System.Threading.Thread(addressof 全局代码里的方法名)
 nthread.start() \'会去执行对应的方法