Foxtable(狐表)用户栏目专家坐堂 → 如何判断异步朗读结束


  共有5379人关注过本帖树形打印复制链接

主题:如何判断异步朗读结束

帅哥哟,离线,有人找我吗?
明丰
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
如何判断异步朗读结束  发帖心情 Post By:2013/9/2 11:08:00 [只看该作者]

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

 

使用 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操作名称 方法返回的 IAsyncResultIsCompleted 属性来确定该操作是否已完成。 有关演示此方法的示例,请参见 轮询异步操作的状态

下面的代码示例演示如何使用 Dns 类中的异步方法来检索用户指定的计算机的域名系统 (DNS) 信息。 此示例创建一个引用 ProcessDnsInformation 方法的 AsyncCallback 委托。 对各个针对 DNS 信息发出的异步请求,将分别调用一次此方法。

请注意,用户指定的主机被传递给了 BeginGetHostByNameObject 参数。 有关演示如何定义和使用更复杂的状态对象的示例,请参见 使用 AsyncCallback 委托和状态对象

 

vb代码:

 

'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
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:贵宾 帖子:35433 积分:178524 威望:0 精华:3 注册:2013/3/30 16:36:00
  发帖心情 Post By:2013/9/2 11:29:00 [只看该作者]

呵呵,这个你想在狐表里实现. 很麻烦的.  你还是放弃吧. 基本上无法实现的了.

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By: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("朗读标识") = "朗读结束"

 

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


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2013/9/2 22:37:00 [只看该作者]

异步朗读不是优先级,其他代码会优先执行,必须通过线程判断。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2013/9/2 22:45:00 [只看该作者]

 楼主,你同步读取吧,你新开一个线程,然后这个线程同步读取,结束的话,做个标识。

 新开线程也很简单。

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

 回到顶部