这是我用来语音 richTextBox 的代码。我的问题是,在播放文本时我无法单击任何内容。我什至无法停止玩。我该如何解决这个问题?有什么方法可以通过单击按钮停止播放吗?
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Synthesis;
namespace Merger
{
public partial class Form1 : Form
{
SpeechSynthesizer tell = new SpeechSynthesizer();
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
richTextBox1.SelectionAlignment = HorizontalAlignment.Center;
tell.Rate = trackBar1.Value;
}
private void Form1_Resize(object sender, EventArgs e)
{
this.Refresh();
}
private void pictureBox2_Click(object sender, EventArgs e)
{
tell.Volume = 100;
tell.Speak(richTextBox1.SelectedText);
}
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
tell.Rate = trackBar1.Value;
}
private void button1_Click(object sender, EventArgs e)
{
tell.SpeakAsyncCancelAll();
}
}
}
问题在于
Speak()
方法是同步的,因此它将锁定您所在的线程。假设您位于单个线程上,那将是 UI 线程,从而锁定您正在执行的任何操作。
您可能最好使用不同的线程
Speak()
,这不会锁定您当前的(UI)线程。
SpeechSynthesizer.Speak 方法(字符串)-MSDN
或者您可以使用 SpeechAsync 方法,该方法将异步执行!
您可以先暂停,然后全部取消,然后再次恢复
private void button1_Click(object sender, EventArgs e)
{
tell.Pause();
tell.SpeakAsyncCancelAll();
tell.Resume();
}
如果您更愿意使用tell.SpeakAsync(richTextBox1.SelectedText),那就更好了。