我想在Visual Basic .NET中创建一个说SAPI的后台工作程序,以便允许我的客户端在听SAPI对话的同时继续做某事。 我已经达到了这一点,但是问题是,如果我想重现其他讲话,则无法取消当前讲话并发生异常。
我有以下代码:
'MODULE IMPORTED IN THE MAIN WORK: argsBackgroundWorker.vb
Public Class argsBackgroundWorker
Public text_to_speak As String
End Class
Private talk As argsBackgroundWorker = New argsBackgroundWorker()
Private Sub sapitalk_background_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles sapitalk_background.DoWork
If (My.Settings.help_voice = True) Then 'PASS TRUE
Dim reproduceText
Dim text As argsBackgroundWorker = e.Argument
'I have put this code to cancel... So? :(
If sapotalk_background.CancellationPending Then Exit Sub
reproduceText = CreateObject("Sapi.spvoice")
reproduceText.speak(talk.text_to_talk)
Else
sapitalk_background.CancelAsync()
End If
End Sub
Private Sub btn_saysomething_Click(sender As Object, e As EventArgs) Handles btn_saysomething.Click
'Support in order to cancel tasks.
sapitalk_background.WorkerSupportsCancellation = True
talk.text_to_speak = "SOMETHING SOOOOOO SOO SOOOOOO LONG..."
'Cancel another text being spoken.
sapitalk_background.CancelAsync()
'Then, talk the new text.
sapitalk_background.RunWorkerAsync(talk)
End Sub
Private Sub principal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'Support in order to cancel tasks.
sapitalk_background.WorkerSupportsCancellation = True
talk.text_to_speak = "SOMETHING SOOOOOO SOO SOOOOOO LONG..."
'Cancel another text being spoken.
sapitalk_background.CancelAsync()
'Then, talk the new text.
sapitalk_background.RunWorkerAsync(talk)
End Sub
它在作为背景说话时效果很好,但是请注意,当我编译该应用程序时,它开始说很长的文字。而且,如果我单击一个按钮以取消当前的发言并说出另一个文本,则该操作将失败并显示正在运行当前的后台工作程序。
答案 0 :(得分:0)
我唯一的想法是
While Not sapitalk_background.IsBusy
sapitalk_background.RunWorkerAsync(talk)
End While
如果卡在该循环中直到声音停止,那么我认为一旦声音在bg线程上运行就无法停止。