最近写一个语音播放系统,要求:播放指定语音,当新播放指令到达后不论设备对旧指令是否播放完毕,都必须启用新的播放内容。写的是一个接口,很是头疼。用同步吧,系统卡在哪个地方,用异步的话,又没有声音,琢磨半天后发现终于发现了问题。
原因:用异步的问题是,调用之后,主线程还在运行,然后飞快运行结束,以致于speech.SpeakAsync();没有时间运行,程序就结束了,这里main方法里(也就是主线程)用Thread.Sleep()就行了,就可以听到声音了,问题又来了,你线程睡眠了,怎么接受新的播放指令列,我的解决方案是重开个线程,播放后让子线程等待。
如下:
private void SpeakVoice()
{
while (true) {
if (VoiceInfo != null)
{
if (flage)
{
speech.SpeakAsyncCancelAll();
speech.SpeakAsync(VoiceInfo);
//标志语音内容是否有改变
flage = false;
//挂起
voiceThead.Suspend();
}
}
}
}
主线程开线程
Thread t = Thread(new TheadStart(SpeakVoice));
。。。。
语音内容有改变
flage = true;
t.Resume();
大致思路就是这样, 刚入门可能写的不详细,大家支持下