以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 如何判断异步朗读结束 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=39805) |
-- 作者:明丰 -- 发布时间:2013/9/2 11:08:00 -- 如何判断异步朗读结束 下面是异步操作的相关资料,请问如何判断异步朗读结束?
使用 AsyncCallback 委托结束异步操作 在等待异步操作结果的同时可以进行其他工作的应用程序不应在操作完成之前阻止等待。
Dns class to retrieve Domain Name System (DNS) information for user-specified computers.\' xml:space="preserve"> BeginGetHostByNameObject parameter.\' xml:space="preserve"> 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"> \'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() MessageBox.show("朗读结束")
或者增加一个名称为"朗读标识"的字符型全局变量,代码为:
Vars("朗读标识") = "朗读中……" Dim sp As New DotNetSpeech.SpVoice() Vars("朗读标识") = "朗读结束"
需要判断的时候,判断这个全局变量的值即可。 |
-- 作者:明丰 -- 发布时间:2013/9/2 22:37:00 -- 异步朗读不是优先级,其他代码会优先执行,必须通过线程判断。 |
-- 作者:有点甜 -- 发布时间:2013/9/2 22:45:00 -- 楼主,你同步读取吧,你新开一个线程,然后这个线程同步读取,结束的话,做个标识。 新开线程也很简单。 dim nthread as New System.Threading.Thread(addressof 全局代码里的方法名) nthread.start() \'会去执行对应的方法
|