2013-07-07 75 views
0
Process process; 

    // Read Contetnt Mouse click event 
    private SpeechSynthesizer readerSpeak; 
    private void btnSpeakContent_Click(object sender, EventArgs e) 
    { 
     if(richTextBoxThanglish.Text.Trim() == string.Empty) 
     { 
      if (process.HasExited == false) 
       process.Kill(); 
      MessageBoxWrapper.ShowWarning("Textbox is Empty.", "ABTS", "Textbox is Empty."); 
      process = Process.Start("narrator.exe"); 
     } 
     else 
     { 
      if (process.HasExited == false) 
       process.Kill(); 

      readerSpeak = new SpeechSynthesizer();     
      readerSpeak.SpeakAsync(richTextBoxThanglish.Text.ToString()); 

      if (process.HasExited == true) 
       process = Process.Start("narrator.exe"); 
     } 
    }  

    private void btnStopSpeak_Click(object sender, EventArgs e) 
    { 
     if (process.HasExited == true) 
      process = Process.Start("narrator.exe"); 

     if (!(readerSpeak == null)) 
     {     
      readerSpeak.Dispose(); 
     } 
    } 

假设上面的程序有两个按钮调用speakContent & stop_speak。我运行narrator.exe进程来获取Windows解说器。 我确实想要说明richtextbox内容没有重叠的声音。我知道Synchronos说话,但它会暂停我的应用程序,直到speakContent完成。我需要SpeakAsyn()。 无论如何在语音解说器中添加沉默?其实我需要3秒后发短信。我曾使用“System.Threading.Thread.Sleep(3000);”。但是仍然发生文本重叠, 手段解说者&串一起演讲。如何避免叙述者和字符串到语音在c#中重叠?

请帮忙。

回答

0

您可能想在后台线程中执行与进程相关的内容...以下是使用BackgroundWorker的示例。它可以在Visual Studio的WinForms工具箱中使用,因此您应该可以将它拖放到表单上。

BackgroundWorkerDoWork事件创建处理程序。这是您将在后台线程中调用其他进程的位置。您可以等待此过程在您的应用程序停止时完成。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    process = Process.Start("narrator.exe"); 
    process.WaitForExit(); 
} 

当有人点击该按钮来读取,你可以检查BackgroundWorker正在运行,什么事都不做,如果是这样的话。

if(this.backgroundWorker1.IsBusy) return; 
+0

谢谢你的时间。我使用key_Leave事件修复了它。 –

+0

如果你愿意,你可以自己发表一个答案(并接受它)来记录你如何修复它(使用代码示例等),这样任何有此问题的人都将知道如何解决它。 –